perl使用定义的变量发出os命令

perl使用定义的变量发出os命令,perl,unix,kerberos,Perl,Unix,Kerberos,我正在向脚本中添加功能,以便它们可以使用kerberos身份验证自动运行,并在执行时使用安全协议。我的功能用于shell脚本,这些脚本完全符合我的要求,但是我在将其移植到perl以在perl脚本中工作时遇到了问题,因为我是perl新手。下面是我正在使用的shell代码,并尝试在perl中获得相同的功能: #!/bin/sh ticketFileName=`basename $0-$$` #set filename variable to name of script plus the PID k

我正在向脚本中添加功能,以便它们可以使用kerberos身份验证自动运行,并在执行时使用安全协议。我的功能用于shell脚本,这些脚本完全符合我的要求,但是我在将其移植到perl以在perl脚本中工作时遇到了问题,因为我是perl新手。下面是我正在使用的shell代码,并尝试在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命令中引用的传递变量。有人有什么想法或建议吗?

问题在于,您将
KRB5CCNAME
建立为一个shell中的环境变量,然后立即丢弃。迈克尔还有一个选择。您还可以使用以下语法在
kinit
调用中传递环境变量:

#!/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";
`KRB5CCNAME=$krb5CacheLocation /usr/share/centrifydc/kerberos/bin/kinit etc.`
尽管在丢弃输出时,只需使用
system
,或者,如果这也是您要做的最后一件事,
exec

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

%ENV
操作的一个好处是,您可以使用多参数
exec

我想您希望这样:

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" );

您执行命令的顺序不一样。顺便说一句,您应该比“它不喜欢”更好地描述您的问题<代码>使用严格;使用警告,调试打印语句,告诉我们哪里出了问题。@VinnieBiros但Perl可以在shell命令中插入变量,这就是TLP的目的。它不知道您想要一个unix环境变量,它是一个Perl变量的本地变量。@VinnieBiros Hunter说的正是我想要的。您似乎意识到,长得离谱的变量名
$krb5CacheLocation
是插值的,但似乎忘记了这同样适用于前面带有美元符号的任何字符串。在本例中,变量的含义相同,但
$0
的实现有所不同。如我所说,对文件名进行调试打印,以确保它符合您的想法。并且使用strict和warnings。当您的转换只不过是将shell代码包装在backticks中时,为什么还要转换呢?如果脚本名为script.pl,那么它会将ticketFileName变量设置为/tmp/script-6875example@TLP这是不正确的。basename剥离扩展名。手册页右侧:root#man basename basename(1)用户命令basename(1)NAME basename-从文件名示例basename/usr/bin/sort输出“sort”中删除目录和后缀。basename包括/stdio.h.h输出“stdio”。所以$0的basename就是文件名