2011-02-10 19 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

相關問題