2017-05-28 89 views
-1

我一直在试图获取perl子例程值和替换,以从exim.conf中的randomips子例程中获取所需的字符串部分。然而,当我使用字符串替换我得到的错误如下:Exim在exim.conf中获取随机凭证

Here is what I am trying to achieve

我试图用冒号分割字符串,并获得第一个出现的“接口”。我将使用第二次出现的“helo_data

exim.pl

sub randomhosts { 
@inet = ("x.x.x.1:hostname1.domain.com","x.x.x.2:hostname2.domain.com","x.x.x.3:hostname3.domain.com" 
); 

return $inet[int rand($#inet+1)]; 

} 

exim.conf

dkim_remote_smtp: 
    driver = smtp 
    interface = "${perl{randomhosts}%:*}" 
    helo_data = "${sender_address_domain}" 

错误我得到的是如下:

"failed to expand "interface" option for dkim_remote_smtp transport: missing '}' after 'perl'". 可能语法 任何帮助?

+0

在我看来,你有一个配置文件,并试图在那里输入perl命令,希望得到一些我不确定的结果。请清理问题以明确你想要的东西。如果你想使用perl来做一些事情,请发布一段可用的代码,或者至少有足够的机会猜测你想要做什么。 – bytepusher

+0

我已编辑它。我不知道我还能解释些什么。基本上我试图旋转海关ips以及他们各自的自定义主机名在exim中,这是用perl – Motsim

+1

构建的。请修复您的问题的格式。您的一些代码被格式化为纯文本格式。如果您希望我们查看您的代码,那么尽可能使其尽可能容易理解,这样很有礼貌。另外,你定义的'@ inet'似乎缺少一些引号字符 - 这意味着它所代表的代码甚至不会编译。如果你不够关心给我们一个你的代码的准确副本,那么我们为什么会关心足够的帮助你? –

回答

2

,您正试图复制是书面的人谁不知道很多有关的Perl代码。它包括这一行:我认为有几个问题在这里

return $inet[int rand($#inet+1)]; 

一个Perl程序员会写为

return $inet[rand @inet]; 

- 一个与你的进出口语法和一个与你的Perl语法。

进出口是给你这个错误:

failed to expand "interface" option for dkim_remote_smtp transport: missing '}' after 'perl'

我不知道从进出口调用Perl的东西,但this page提到像${perl{foo}}语法(这类似于你在页面中使用的一个复制)和一个像${perl{foo}{argument}}调用子程序并传递参数。无处没有提到的语法像你这样的:

${perl{randomhosts}%:*} 

我不知道,你已得到该语法,但它很可能,这是什么原因造成你的第一个错误。

在评论,你说

I am stying to get first part of string before colon for each random array value for "interface" and part after colon for "helo_data"

这在我看来,进出口不支持这一要求。您需要调用该函数两次以获取您需要的两条信息。你可以在Perl中使用类似state这样的变量来实现这一点 - 但它会比你目前在那里的代码复杂得多。其次,你的Perl代码有语法错误,所以即使Exim能够调用你的代码,它也不起作用。

你复制设置@inet这样的代码:

@inet = ("x.x.x.1", "x.x.x.2", "x.x.x.3", "x.x.x.4"); 

你的等效代码是这样的:

@inet = (
    "x.x.x.1:hostname1.domain.com", 
    "x.x.x.2:hostname2.domain.com, 
    x.x.x.3:hostname3.domain.com 
); 

我已经重新格式化它,使问题更加明显。您在数组元素周围缺少一些引号。 (注:我看到的是,虽然我一直在写这个答案,你有固定的。)

更新:好吧,这里是一些代码投入exim.pl,你想要做什么。

use feature qw[state]; 

sub randomhosts { 
    state $current; 

    my @inet = (
    "x.x.x.1:hostname1.domain.com", 
    "x.x.x.2:hostname2.domain.com", 
    "x.x.x.3:hostname3.domain.com" 
); 

    if ($_[0] eq 'generate') { 
    shift; 
    @{$current}{qw[ip host]} = split /:/, $inet[rand @inet]; 
    } 

    return $current->{$_[0]}; 
} 

它生成一个新的ip/host对,如果它的第一个参数是'generate'。然后它将从生成的对中返回主机名或IP地址。我想你也许可以从您的进出口config文件中这样称呼它:

但我在进出口方面的专家,所以语法可能需要调整。

+0

谢谢你的帮助戴夫。但是,这种exim语法是问题所在。你在这里介绍的方法确实达到了我想要得到的结果。再次感谢.. – Motsim

+0

@Motsim:我很高兴它很有用。我希望你花时间了解它是如何工作的,而不仅仅是复制和粘贴它。堆栈溢出不是免费的代码写入服务。 –

1

首先我想说明我没有使用exim,所以我不能说你究竟在做什么,以及为什么你已经完成了这样的事情。

在您发布的链接,添加一个名为“randinet”的方法来exim.pl和exim.conf接口线由

interface = "${perl{randinet}}"

你已经实现了“randomhosts”的方法取代并取代了接口符合

interface = "${perl{randomhosts}%:*}"

现在解析器抱怨没有找到右括号。这可能是由于您可以自由添加的符号,但解析器没有被忽略的自由。

我建议你尝试

interface = "${perl{randomhosts}}"

+0

非常感谢您的回复。我试图在冒号前为每个“接口”的随机数组获取字符串的第一部分,冒号后的部分为“helo_data”。因此,不能只使用'“$ {perl {randomhosts}}”。 – Motsim