Shell 脚本:ssh 到远程机器,然后退出:'exit' 不起作用

Mar*_*ert 4 ssh bash shell command-line exit

我有以下类型的 shell 脚本:

#!/bin/bash

ssh mylogin@myremotemachine.com
echo "Hi"
exit
Run Code Online (Sandbox Code Playgroud)

我在本地运行它以在远程服务器上执行某些操作(由“echo“Hi”表示)。但是,当我运行它时,我在远程服务器上看到了提示——因此没有执行“退出”命令。当我在远程提示上手动输入“退出”时,我看到“连接到 myremotemachine.com”关闭,然后 “嗨”。如何设置 shell 脚本以使其正确退出并向我显示我执行它的(本地)提示?

https://unix.stackexchange.com/questions/89747/ssh-exits-after-quit-case-in-bash-scriptssh 和 shell 通过 ssh:如何退出?似乎有些相关,但我无法适应那里提出的想法。/

更新

以下,不是那么最小的版本导致Unmatched '..

#!/bin/bash

date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin mylogin@myremotemachine.com:/u3/mylogin/backup/$date\_backup
ssh mylogin@myremotemachine.com bash -c "'
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
exit
'"
Run Code Online (Sandbox Code Playgroud)

如果我删除此代码段中的双引号,我会得到:bash: -c: option requires an argumentdate: Undefined variable.

R J*_*R J 8

这应该可以解决您的问题。

ssh mylogin@myremotemachine.com << HERE
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
HERE
Run Code Online (Sandbox Code Playgroud)

或者您可以执行以下操作。将要在远程主机上运行的所有命令放在一个单独的脚本中。给它起一个像 remote.sh 这样的名字

现在运行以下命令

ssh mylogin@myremotemachine.com 'bash -s' < /path/to/remote.sh
Run Code Online (Sandbox Code Playgroud)

remote.sh 包含的地方。

rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
Run Code Online (Sandbox Code Playgroud)