Exim在exim.conf中获取随机凭证

时间:2017-05-28 09:33:26

标签: perl exim exim4

我一直在尝试获取perl子例程值和替换,以从exim.conf中的randomips子例程获取字符串所需的部分。但是,当我使用字符串替换时,我得到如下错误:

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'". 可能是语法。 有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

您尝试复制的代码是由对Perl不太了解的人编写的。它包括这一行:

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

Perl程序员会把它写成

return $inet[rand @inet];

我认为这里有几个问题 - 一个是你的Exim语法,一个是你的Perl语法。

Exim给你这个错误:

  

未能扩展"界面" dkim_remote_smtp传输的选项:缺少'}'在' perl'

之后

我对从Exim调用Perl一无所知,但是this page提到的语法类似${perl{foo}}(类似于您正在复制的页面中使用的语法)和一个像${perl{foo}{argument}}一样调用子程序并传递一个参数。它没有提到像你这样的语法:

${perl{randomhosts}%:*}

我不确定你从哪里获得这种语法,但似乎这可能是导致你第一次出错的原因。

在评论中,你说

  

我正在为#"接口"的每个随机数组值获取冒号前的字符串的第一部分。和#34; helo_data"

之后的冒号

在我看来,Exim并不支持这一要求。您需要调用该函数两次才能获得所需的两条信息。您可以使用类似state变量之类的东西在Perl中执行此操作 - 但它会比您当前的代码复杂得多。

其次,您的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]};
}

如果第一个参数是' generate'它会生成一个新的ip / host对。然后它将从生成的对返回主机名或IP地址。我想你可以从你的Exim配置文件中调用它:

dkim_remote_smtp:
  driver = smtp
  interface = "${perl{randomhosts}{generate}{ip}}"
  helo_data = "${perl{randomhosts}{host}}"

但我不是Exim的专家,所以语法可能需要调整。

答案 1 :(得分:1)

首先,我想说明我没有使用exim,所以我不能说你到底想要做什么以及为什么你这样做了。

在您发布的链接中,有一种叫做“randinet”的方法。添加到exim.pl中,exim.conf中的接口行替换为

interface = "${perl{randinet}}"

您已经实施了随机主机'方法并用

替换了接口行

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

现在解析器抱怨没有找到结束括号。这可能是由于您可以随意添加的符号,但解析器无法忽略。

我建议你试试

interface = "${perl{randomhosts}}"