Скрипт оболочки: ssh на удаленной машине, затем выход: «exit» не работает

Скрипт оболочки: ssh на удаленной машине, затем выход: «exit» не работает

У меня есть скрипт следующего типа:

#!/bin/bash

ssh [email protected]
echo "Hi"
exit

Я запускаю его локально, чтобы сделать что-то на удаленном сервере (представлено как 'echo "Hi"'). Однако, когда я запускаю его, я вижу приглашение на удаленном сервере, поэтому команда 'exit' не выполняется. Когда я затем вручную ввожу 'exit' в удаленном приглашении, я вижу, что "Connection to myremotemachine.com" закрыто изатем "Привет". Как мне настроить скрипт оболочки так, чтобы он корректно завершался и показывал мне (локальную) командную строку, из которой я его запустил?

https://unix.stackexchange.com/questions/89747/ssh-exits-after-quit-case-in-bash-scriptиssh и 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 argumentиdate: 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

Хотя ответ Барлопса правильный, я думаю, мы можем расширить его, чтобы сделать его более понятным. Поскольку вы, кажется, используете скрипт, я бы предложил что-то вроде этого:

#!/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
'

Когда я попробовал упрощенную версию, переменная date работала без проблем, возможно, это исправит проблему bash -c, которая у вас была. Также выход в конце не нужен, когда выполняется последняя команда, сеанс ssh автоматически закрывается.

Связанный контент