Shell 脚本:通过 ssh 连接到远程机器,然后退出:“exit”不起作用

Shell 脚本:通过 ssh 连接到远程机器,然后退出:“exit”不起作用

我有以下类型的 shell 脚本:

#!/bin/bash

ssh [email protected]
echo "Hi"
exit

我在本地运行它以在远程服务器上执行某些操作(以“echo "Hi"”表示)。但是,当我运行它时,我看到远程服务器上的提示符 - 因此“exit”命令未执行。当我在远程提示符上手动输入“exit”时,我看到“与 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 [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] bash -c "'
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
exit
'"

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

答案1

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

ssh [email protected] << HERE
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
HERE

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

现在运行以下命令

ssh [email protected] 'bash -s' < /path/to/remote.sh

remote.sh 包含的内容。

rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup

答案2

你可以做

$ssh user@comp echo abc<ENTER>

然后它将运行该命令(输出 abc),然后退出

答案3

也许脚本末尾没有换行符?

如果退出后没有空行(确切地说LF是换行符) - 您的脚本将不会以编程方式“按下回车键”。

答案4

虽然 barlops 的答案是正确的,但我认为我们可以对其进行扩展,使其更清晰。由于您似乎正在使用脚本,我建议这样做:

#!/bin/bash

ssh [email protected] "echo Hi\!"

额外阅读:我还建议您研究一下特殊字符以及何时需要转义它们,因为 bash 会自动解析双引号中的感叹号。您可以使用单引号或反斜杠字符来“转义”它,从而解决这个问题。

编辑:

#!/bin/bash
date=`date "+%Y-%m-%d"`
rsync -acxzP --delete --link-dest=/u3/mylogin/backup/old_backup /home/mylogin [email protected]:/u3/mylogin/backup/$date\_backup
ssh [email protected] '
date=`date "+%Y-%m-%d"`
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
'

当我尝试简化版本时,日期变量可以正常工作,也许这将纠正您遇到的 bash -c 问题。此外,最后不需要退出,当执行最后一个命令时,ssh 会话会自动关闭。

相关内容