【问题标题】:Bash/Perl chained SSH commands (A to B to C)Bash/Perl 链式 SSH 命令(A 到 B 到 C)
【发布时间】:2011-06-24 13:15:47
【问题描述】:

我在机器 A 上运行 bash shell,通过 ssh 在机器 B 上运行 perl shell,通过 ssh 向机器 C 请求命令结果。我无法在机器 A 上获得 tty 中显示的结果...

这里是几千行代码的总结:

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

...  
ssh -p port userb@machineB "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  

独立运行,step2 和 step3 显示预期结果,但从机器 A 运行 scriptB.pl 不会返回预期数据。我现在不使用 Net::SSH2 但 qx。可能是客户端 ssh 设置中的问题。

谢谢。

【问题讨论】:

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

标签: perl bash ssh


【解决方案1】:

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

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

ssh 以远程命令的退出状态退出,如果发生错误则以 255 退出。

我很惊讶您没有从失败的 ssh 中看到一些诊断信息。您是将标准错误重定向到/dev/null,还是在大量其他输出中丢失?

您使用的是未加密的 ssh 密钥还是 rhosts 身份验证?您是否将连接转发到您的身份验证代理(~/.ssh/config 中的ForwardAgent)?调试时,能不能去掉中间人,直接从主机A发出命令到主机C?

【讨论】:

  • 重定向哦输出到 /dev/null: no
  • ssh 使用 dsa 密钥启用,并使用钥匙串从一台机器链接到另一台机器。 ForwardAgent:没有。
  • 直接从主机 A(也通过 ssh)发出 bash 命令来托管 C:是的,它有效。 (我需要检查删除 shell 中的一些 ssh 选项,例如用于压缩的“-C”)
  • @hornetbuzz 你在标准错误中看到了什么?丢弃标准输出可能会有所帮助:ssh ... >/dev/null
  • 在寻找根本原因的路上:我收到“权限被拒绝(公钥,密码)”。在机器A上运行perl scriptB时。该脚本被拒绝ssh访问机器C。但当我在机器B上运行脚本时不是。我从机器A启动时检查了机器B上的代码运行器,它是同一个用户比我从机器 B 上“手动”运行 scriptB 时。不知道是否清楚..
【解决方案2】:

对于那些将面临同样问题的人:

服务器 A 上的上下文:

ssh user_foo@serverB "ssh user_bar@serverC"  

要让它在命令行或 shell 中工作,应转发 ssh 代理,例如使用 ssh 选项“A”(参见 ssh 手册页),例如:

ssh -A user_foo@serverB "ssh user_bar@serverC"  

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2016-11-09
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多