我听过多种是非对错的答案,但我仍然不知道这是否可能。我通过 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
答案3
或者,简单地回显到管道,然后从标准输入执行所有内容。
echo " \
uname -a; \
whoami; \
uname " \
| ssh -l root localhost 'cat | sh -'