【发布时间】:2016-10-28 04:24:41
【问题描述】:
我想捕获 ssh 会话的输出。但是,我首先需要 ssh 两次(从我的本地计算机到远程门户到远程服务器),然后运行命令并捕获输出。
逐行执行,我会这样做:
ssh name@remote.portal.com
ssh remote.server.com
remote.command.sh
我尝试了以下方法:
server=remote.server.com ##define in the script, since it varies
sshoutput=$(ssh -tt name@remote.portal.com exec "ssh -tt ${server} echo \"test\"")
echo $sshoutput
我希望上面的脚本在最终命令之后回显“test”。但是,在我输入命令后,外部 ssh 提示符只是挂起,一旦我 Ctrl+c 或无法输入我的密码,内部 ssh 会话就会失败(我相信因为 stdout 不再打印到屏幕上,我不再得到我的密码提示)。
如果我只运行内部命令(即,没有“sshoutput=$(”将其保存为变量),那么它可以工作,但(显然)不捕获输出。我也尝试过没有“exec”。
我也尝试过将内部 ssh 保存为变量,例如
sshoutput=$(ssh -tt name@portal myvar=$(ssh -tt ${server} echo \"test\"") && echo $myvar)
但这失败了,因为 BASH 在将内部 ssh 发送到外部 ssh 会话之前尝试执行内部 ssh(我相信),并且无法识别服务器名称。
(我看过https://unix.stackexchange.com/questions/89428/ssh-twice-in-bash-alias-function,但他们只是说“如果使用交互式密码需要更多标志”并且没有解决捕获输出的问题)
提前感谢您的帮助!
【问题讨论】:
-
到目前为止,最好的方法是使用
ProxyCommand让 ssh 自己完成设置内部 ssh 会话的工作。 -
你为什么使用
-tt?我不确定这对这个问题有什么影响,但似乎没有必要。 -
@ProxyCommand 评论:类似于下面的链接?我上面的 remote.command.sh 实际上设置了一个 VNC 服务器并返回要使用的端口(例如,“:3”),然后我 ssh 隧道到该端口。以下链接中的命令会干扰(和/或没有权限)吗? cyberciti.biz/faq/…
-
@cwotta,请在在您的问题本身中包含足够的内容来生成和测试答案,而不是在链接后面(特别是在cyberciti.biz链接后面;我不会不要用 10 英尺长的杆子碰它)。也就是说,一般来说,
ProxyCommand的使用不会干扰其他类型的 SSH 代理支持。 -
@why -tt:通过查看各种网站,似乎有必要,因为我是双重 ssh-ing。我会收到“不是真正的终端”类型的错误(具体记不清了),但它似乎不再是问题,因为我只是在没有它的情况下进行了测试,但它不再存在,尽管我的命令无法执行。跨度>