0

我正在向我的脚本添加功能,以便它们可以使用 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 命令中引用的传递变量。有人有什么想法或建议吗?

4

3 回答 3

1

或者一个问题是,您KRB5CCNAME在一个立即丢弃的 shell 中建立了一个环境变量。迈克尔对此有另一种选择。kinit您还可以使用以下语法在调用时传递环境变量:

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

尽管当您丢弃输出时,只需使用systemor,如果这也是您要做的最后一件事,exec

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

操作的一个好处%ENV是您可以使用 multi-argument exec

于 2013-07-02T17:38:19.677 回答
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";
于 2013-07-02T17:02:45.153 回答
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" );
于 2013-07-02T19:18:54.040 回答