Bash 如何将脚本的输出作为参数传递给ssh命令?

Bash 如何将脚本的输出作为参数传递给ssh命令?,bash,unix,ssh,Bash,Unix,Ssh,我有一个脚本,显示我正在运行的AWS上的所有实例: $/home/scripts/show_instances.sh i-f66d2de0 running 10.148.17.40 i-fxxdbbe0 running 10.148.20.60 (...) 我想做的是使用第一个IP,通过管道连接到ssh并自动连接到服务器。我试过这个: $/home/scripts/show_instances.sh | tail -1 | awk '{print $3}' | xargs ssh 但不起

我有一个脚本,显示我正在运行的AWS上的所有实例:

$/home/scripts/show_instances.sh
i-f66d2de0  running 10.148.17.40
i-fxxdbbe0  running 10.148.20.60
(...)
我想做的是使用第一个IP,通过管道连接到ssh并自动连接到服务器。我试过这个:

$/home/scripts/show_instances.sh | tail -1 | awk '{print $3}' | xargs ssh

但不起作用:它连接到服务器,但在我键入第一个命令(即ls)后,终端似乎在等待什么,什么也没有发生(我在mac上连接到Unix),因此我必须使用ctrl+c退出实例。一些建议?

使用命令替换,在其中运行一次
awk
,从第一行获得所需的IP,然后执行
ssh

ssh "$(/home/scripts/show_instances.sh | awk 'NR==1{print $NF; exit}')"
如果您想坚持使用管道,并且
xargs
one,那么分配伪TTY(
-t
)应该允许您以交互方式进入并运行:

/home/scripts/show_instances.sh | awk 'NR==1{print $NF; exit}' | xargs ssh -tt

对于最后一行,请执行以下操作:

ssh "$(/home/scripts/show_instances.sh | awk 'END{print $NF}')"
/home/scripts/show_instances.sh | awk 'END{print $NF}' | xargs ssh -tt

不确定在这种情况下,
xargs
是否为您购买了任何东西。如果你的标题真的是你的Q,那么
ssh$(..../show_instances.sh | awk'NR==1{print$3}')…其他ssh内容…
(使用cmd替换
$(…)
)应该可以解决你的问题。(不需要尾巴)。否则,您的问题可能是关于“如何使用
xargs
)。祝您好运。通常您可以使用反勾号(或
$()
)来获取此信息(我无法向您展示反勾号是如何工作的,因为它们在StackOverflow网站上用于格式化目的)哇!天才!现在开始工作了!我是这样做的:ssh
/home/scripts/show|u instances.sh|tail-1|awk'{print$3}'
谢谢!解释得更好,两种方法都有效,就像你说的。ssh(backticks)/home/scripts/show|instances.sh|tail-1|awk'{print$3}'(backticks)或使用$(..)ssh“$(/home/scripts/show_instances.sh | tail-1 | awk'{print$3}')“谢谢你!加入90年代早期,使用
$(…cmds sub)
$)-…如果你在使用一个不支持
$(..)的古老系统时遇到困难,Backticks就是你的备份。”
。另外,请阅读有关
awk
内部变量
NR
,对于这种情况,您不需要
tail
。祝您好运。成功!我这样做了:ssh“$(/home/scripts/show_instances.sh|tail-1 | awk'{print$3}”)“谢谢@Arthuracioly检查我的编辑。你不需要
tail
,你可以用
awk
单独完成。哇!更好!像这样,对吗?ssh“$(/home/scripts/show_instances.sh|awk'END{print$NF}”)我对awk不是很好。为什么NF获得了确切的IP?顺便说一句,ssh-tt的第二个选项不起作用,我遇到了相同的问题,终端在任何命令之后都会等待一些东西,比如“ls”。但是,无论如何,我对这个命令非常满意。@Arthuracioly
NF
获取字段数,
$NF
获取最后一个字段的预期值。