2016-07-07 183 views
1

我想ssh到一个节点并在那里运行一个命令,然后退出。所有点头都重复了这一点。该脚本是相当简单的bash脚本ssh并运行命令

#!/bin/bash 
NODES="compute-0-0 compute-0-1 compute-0-2 compute-0-3" 
for i in $NODES 
do 
    ssh $i 
    ls -l /share/apps 
    rpm -ivh /share/apps/file.rpm 
    exit 
done 

但问题是,在SSH之后,ls -l命令错过。因此,命令提示符等待输入!

有什么办法解决这个问题?

UPDATE:

我修改了循环体为

ssh $i <<END 
ls -l /share/apps 
exit 
END 

,但我得到

./lst.sh: line 9: warning: here-document at line 5 delimited by end-of-file (wanted `END') 
./lst.sh: line 10: syntax error: unexpected end of file 
+2

见http://stackoverflow.com/questions/37586811/pass-commands-as-input-to-another-command-su-ssh-sh-etc – Leon

+0

如果你想您脚本的'ssh'节缩进,使用'<< - END' – Leon

+1

您接受的答案应该可行。但是,你的在线文件方式也没有错。我想,你已经在'exit'行之后的'END'之前添加了一些空格。或者,如果您将这些空格用于缩进,请将heredoc行更改为'ssh $ i << - END'(注意'<< - '运算符而不是'<<) – anishsane

回答

1

试试这个

#!/bin/bash 
    NODES="compute-0-0 compute-0-1 compute-0-2 compute-0-3" 
    for i in $NODES 
    do 
     ssh $i "ls -l /share/apps;rpm -ivh /share/apps/file.rpm;exit;" 
    done 
0

我会改剧本,并会用命令来运行ssh命令执行。

例如:

#!/bin/bash 
NODES="compute-0-0 compute-0-1 compute-0-2 compute-0-3" 
for i in $NODES 
do 
    ssh $i "ls -l /share/apps && rpm -ivh /share/apps/file.rpm && exit" 
done 

&&操作者意味着只有如果先前的命令成功的每个命令将被执行。

如果要独立运行该命令,则可以改为将&&运算符更改为;