2013-07-02 21 views
0

我加入的功能到我的劇本,讓他們可以使用Kerberos身份驗證自動運行和執行時使用的安全協議的操作系統命令。我有我的功能工作的shell腳本,正是我想要的,但我有問題將其移植到我的Perl腳本中工作,因爲我是新的Perl。這是我的工作shell代碼,並試圖獲得在Perl相同的功能:perl的發行與定義的變量

#!/bin/sh 
ticketFileName=`basename $0-$$` #set filename variable to name of script plus the PID 
krb5CacheLocation=/tmp/$ticketFileName #set ticket cache location to /tmp + script name 
/usr/share/centrifydc/kerberos/bin/kinit -c $krb5CacheLocation -kt /root/.ssh/someaccount.keytab someaccount #get TGT and specifiy ticket cache location on kinit 
export KRB5CCNAME=$krb5CacheLocation #set the KRB5CCNAME variable to tell ssh where to look 

我曾試圖用Perl:

#!/usr/bin/perl 
my $ticketFileName = `basename $0-$$`; 
my $krb5CacheLocation = '/tmp/'.$ticketFileName; 
`export KRB5CCNAME=$krb5CacheLocation`; 
`/usr/share/centrifydc/kerberos/bin/kinit -c $krb5CacheLocation -kt /root/.ssh/someaccount.keytab someaccount`; 

看來,這是不喜歡我我引用了傳遞的變量OS命令。任何人有任何想法或建議?

+0

您還沒有以相同的順序執行這些命令。 –

+0

是什麼讓你認爲Perl認爲'$ 0'和'$$'是shell變量? – TLP

+2

順便說一句,你應該比「不喜歡」更好地描述你的問題。 '嚴格使用;使用警告;',調試打印語句,你告訴我們出了什麼問題。 – TLP

回答

1

的,或一個問題是,你建立KRB5CCNAME作爲一個shell的環境變量會立即扔掉。邁克爾有一個替代方案。您還可以通過環境變量的kinit調用,使用此語法:

`KRB5CCNAME=$krb5CacheLocation /usr/share/centrifydc/kerberos/bin/kinit etc.` 

雖然你扔掉的輸出,只是使用system或者,如果這也是你會做的最後一件事,exec

exec "KRB5CCNAME=$krb5CacheLocation /usr/share/centrifydc/kerberos/bin/kinit etc." 

%ENV操作的好處是,你可以再使用的多參數exec

0
#!/usr/bin/perl 

    # what is the value of $0 , which script? a: set to current script 
    my $ticketFileName = `basename $0`; 
    chomp($ticketFileName); 
    $ticketFileName .= $$; 
    my $krb5CacheLocation = '/tmp/'.$ticketFileName; 
    $ENV{'KRB5CCNAME'}=$krb5CacheLocation; 
    @x = qx(/usr/share/centrifydc/kerberos/bin/kinit -c $krb5CacheLocation -kt      
    /root/.ssh/unixmap0000.keytab unixmap0000); 
    print join "\n",@x,"\n"; 
+0

說,腳本名爲script.pl,它會設置ticketFileName VAR到/ tmp /腳本6875例如 –

+0

@TLP這是不正確。基本名稱剝離擴展名。右出人頁的: 根#男子基本名 BASENAME(1)用戶命令BASENAME(1) NAME 基名 - 條從文件名 實施例 基名的/ usr /斌/排序 輸出 「排序」 目錄和後綴。 basename include/stdio.h .h 輸出「stdio」。 所以$ 0的基名只是文件名 –

0

我想你想是這樣的:

use File::Basename; 

# set filename variable to name of script plus the PID 
my $ticket_file_name = basename "$0" . "-$$"; 

# set ticket cache location to /tmp + script name 
my $krb5CacheLocation = "/tmp/$ticket_file_name"; 

# set the KRB5CCNAME variable to tell ssh where to look 
$ENV{KRB5CCNAME} = $krb5CacheLocation; 

# get TGT and specifiy ticket cache location on kinit 
system("/usr/share/centrifydc/kerberos/bin/kinit -c $krb5CacheLocation -kt /root/.ssh/someaccount.keytab someaccount");