2017-05-28 86 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