如何ssh到第二个服务器,运行命令,并将输出分配给变量?

时间:2016-03-23 19:25:40

标签: unix ssh

这就是我想要做的事情:

fromServer=$(ssh -A first.com ssh second.com rpm -qa | grep exampleString)
echo $fromServer

echo不会打印任何内容。如果我首先手动shh然后ssh到秒,然后运行命令我得到输出:

ssh first.com
ssh second.com
rpm -qa | grep exampleString

如何将这三个步骤合并为一行并将输出存储到变量中?

1 个答案:

答案 0 :(得分:1)

使用正确的引用或转义:

fromServer=$(ssh -A first.com 'ssh second.com rpm -qa | grep exampleString')
echo $fromServer

fromServer=$(ssh -A first.com ssh second.com rpm -qa \| grep exampleString)
echo $fromServer

% VAR=$(ssh -C user@server ls -la \| grep vim)
% echo $VAR
-rw-------  1 user user      15153 Mar  22 13:45 .vimrc

编辑:oooooooh,鬼鬼祟祟,我没有看到你在做什么两个 SSH☺

那么你需要更多的引用,因为你不希望你的管道被first.com解释。以下是解决这个问题的三种方法:

fromServer=$(ssh -A first.com ssh second.com rpm -qa \\\| grep exampleString)
fromServer=$(ssh -A first.com 'ssh second.com rpm -qa \| grep exampleString')
fromServer=$("ssh -A first.com 'ssh second.com rpm -qa | grep exampleString'")

您要执行的是:

user@second % rpm -qa | grep exampleString
<{1>}服务器上的

,因此您必须转义管道,以便second.com服务器不解释它:

first.com

但是再一次,您需要在user@first % ssh second.com rpm -qa \| grep exampleString or user@first % ssh second.com 'rpm -qa | grep exampleString' 上从本地工作站执行该操作,因为您仍然不希望看到管道解释,您需要添加第二层转义/引用:

first.com

然后,一旦你确定你得到一个输出,你可以将整个命令的输出放在一个变量中:

user@workstation % ssh first.com "ssh second.com 'rpm -qa | grep exampleString'"
or
user@workstation % ssh first.com 'ssh second.com rpm -qa \| grep exampleString'

HTH