2011-02-10 24 views
0

我在机器A上运行bash shell通过ssh运行在机器B上的perl shell,通过ssh向机器C请求命令结果。我无法获得在机器A TTY所示结果...Bash/Perl链接SSH命令(A到B到C)

这里是几千的线路码的总结:

1)上机 “A” 的bash “A”:NOK

... 
ssh -p port [email protected] "scriptB.pl" 
... 

2)perl scriptB.pl“在机器”B“上:OK

... 
# my $user = qx|$ssh_cmd| if ($ssh_connection_ok); 
my $user = qx#$ssh_cmd# if ($ssh_connection_ok); 
... 

3)上机 “C” bash命令$ ssh_cmd:OK

cat /my_dir/my_file | grep this_user | head -n1 | cut -d: -f1 | tr 

运行作为独立的,步骤2和步骤3中显示的是预期的结果,但是从机械的运行scriptB.pl不会返回预期的数据。我目前不使用Net :: SSH2,而是使用qx。可能是客户端ssh设置中的问题。

Thx in adv。

+0

是,$?在机器B上运行scriptB时返回0,但在机器A上运行时返回65280.我应该如何解释这个..?我也在机器B上本地运行scriptB,并从那里获得期望值。以及在machineC上运行cmd。我也试过在perl shebang之后加入$ | = 1,没有差异。 – hornetbzz

回答

1

如果失败很重要,请检查外部程序的退出状态。要从POSIX模块中获取$?的退出状态 - 请参阅perlvar documentation -use $? >> 8WEXITSTATUS

在你的情况下,65280对应于255退出状态,并根据该ssh manual

SSH与退出远程命令的退出状态或255是否发生了错误。

我很惊讶你没有看到一些来自失败的SSH的诊断。你是否将标准错误重定向到/dev/null,或者是否在其他输出中丢失?

您是使用未加密的ssh密钥还是使用rhosts身份验证?您是否将连接转发给您的身份验证代理(您的~/.ssh/config中的ForwardAgent)?对于调试,你可以削减中间人,并发出命令,直接从主机A托管C?

+0

将输出重定向到/ dev/null:否 – hornetbzz

+0

使用dsa密钥启用ssh,并使用从1台机器到另一台机器的钥匙串进行链接。 ForwardAgent:没有。 – hornetbzz

+0

直接从主机A(也通过ssh)发布bash命令来托管C:是的。 (我需要检查删除shell中的一些ssh选项,例如“-C”进行压缩) – hornetbzz

相关问题