1

我正在创建一个 perl 脚本,该脚本在 TeamCity 中使用 net::SSH2 创建一个通道。我能够让我的命令执行,但我无法让频道正确记录并返回错误代码,如果出现问题,TeamCity 会失败。

我尝试了许多不同的变体,但这是我当前的代码。

$chan = $ssh2->channel();
$chan->blocking(0);
$chan->shell();
$exitCode = 1;
print $chan "/usr/bin/dos2unix /nfsMount/tomcat/cronScripts/*.sh\n";
while (<$chan>)
{
    print "dos2unix utility successful.\n";
    $exitCode = 0;
}

我不太了解这个频道的工作原理。根据我在此处阅读的内容,执行代码后似乎需要某种绑定的文件句柄。我的代码执行,但从未进入该 while 块。我还尝试了以下变体:

$chan->exec('/usr/bin/dos2unix /nfsMount/tomcat/cronScripts/*.sh');
print "dos2unix successful" while <$chan>;

无济于事。

4

1 回答 1

-1

对于只执行一个检查返回状态的命令,Net::SSH2::Simple看起来很简单。我建议尝试一下:

use Net::SSH2::Simple;

my $ssh2 = Net::SSH2::Simple->new();
{
    my ($stdout,$stderr, $exitcode) = $ssh2->cmd( "uname -sr" ) or die "cannot execute uname: $self->error";
    if ($exitcode == 0) {
            print $stdout if $stdout;
            print $stderr if $stderr;
    }
    else {
            print $stderr if $stderr;
            die "uname failed with exit code $exitcode";
    }
}
于 2013-07-23T16:43:16.387 回答