ssh连接后如何运行脚本

ssh连接后如何运行脚本

我听过多种是非对错的答案,但我仍然不知道这是否可能。我通过 ssh 连接到服务器,然后想要运行一段脚本。

while read server <&3; do   #read server names into the while loop    
serverName=$(uname -n)
 if [[ ! $server =~ [^[:space:]] ]] ; then  #empty line exception
    continue
 fi   
 echo server on list = "$server"
 echo server signed on = "$serverName"
 if [ $serverName == $server ] ; then #makes sure a server doesn't try to ssh to itself
    continue
 fi
    echo "Connecting to - $server"
    ssh "$server"   #SSH login
    echo Connected to "$serverName"
    exec < filelist.txt
    while read updatedfile oldfile; do
    #   echo updatedfile = $updatedfile #use for troubleshooting
    #   echo oldfile = $oldfile   #use for troubleshooting
               if [[ ! $updatedfile =~ [^[:space:]] ]] ; then  #empty line exception
                continue # empty line exception
               fi
               if [[ ! $oldfile =~ [^[:space:]] ]] ; then  #empty line exception
                continue # empty line exception
               fi 
            echo Comparing $updatedfile with $oldfile
            if diff "$updatedfile" "$oldfile" >/dev/null ; then
                echo The files compared are the same. No changes were made.
            else
                echo The files compared are different.
                cp -f -v $oldfile /infanass/dev/admin/backup/`uname -n`_${oldfile##*/}_$(date +%F-%T)
                cp -f -v $updatedfile $oldfile 
            fi          
    done        
 done 3</infanass/dev/admin/servers.txt

我想在 ssh 连接到服务器后运行代码块。

答案1

您当前遇到的问题是 SSH 连接“暂停”脚本,并且echo Connected to "$serverName"仅在 SSH 会话退出后脚本才恢复该行。

在我看来,你有两个选择。 (可能还有更多,但这是我目前能想到的两个。)

选项一是用于expect启动可通过脚本控制的 SSH 会话,有效地将命令从主脚本来回发送到 SSH 会话。选项二是将要远程运行的块作为不同的脚本放在远程服务器上,并以非交互式方式运行 SSH:ssh $server $script-to-run

答案2

如果您绝对确信要将其构建为单个脚本,则可以使用赫雷多克当您打开与远程 ssh 服务器的连接时。

例如:

$ ssh user@server << EOT

...
commands
...

EOT

答案3

或者,简单地回显到管道,然后从标准输入执行所有内容。

echo " \
uname -a; \
whoami; \
uname " \
| ssh -l root localhost 'cat | sh -'

相关内容