执行SSH后脚本停止

时间:2018-06-28 17:05:56

标签: ssh scripting

当我在for循环内的某台计算机上执行SSH时,它正在执行ssh,但无法进一步执行。 代码如下:

string=c01.test.cloud.com,c02.test.cloud.com
for i in $(echo $string | sed "s/,/ /g")
do
    ssh -t -t AppAccount@$i
    cd a/b/c
    str2=x,y,z
done

1 个答案:

答案 0 :(得分:2)

我是从您的问题中得出的,您希望cd a/b/c在远程服务器上运行?这不是该脚本正在执行的操作。对ssh的调用将打开SSH隧道,并为您提供交互式终端连接。然后,它等待该连接终止。 (我怀疑如果您按Control-D,该脚本将继续。)您在此处使用-t -t尤其奇怪。您为什么要强迫远程用户?这使问题变得更糟(不是很多,因为它无论如何都不会起作用,但这似乎与您想要的相反)。

我认为这是您想要的脚本:

string=c01.test.cloud.com,c02.test.cloud.com
for i in $(echo $string | sed "s/,/ /g")
do
    ssh AppAccount@$i 'cd a/b/c; str2=x,y,z'
done

(这当然不会做任何事情,但我认为您的真实脚本比设置shell变量并退出还要多。)重点是您需要将要作为参数运行的脚本传递给ssh。否则,它将生成一个交互式外壳,并等待您将其关闭。

请注意,如果您的脚本非常复杂,那么将所有内容都放在单引号字符串中可能会非常不便。如果您的内部脚本在其自己的文件中,则一种简单的处理方法是使用bash -s从标准输入中读取脚本:

cat some_script | ssh server 'bash -s'

您也可以使用bash Here docs来达到相同的目的,但这对于这种用途来说可能太花哨了。