Сценарий оболочки: ssh на удаленную машину, затем выход: "выход" не работает

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

#!/bin/bash

ssh mylogin@myremotemachine.com
echo "Hi"
exit

Я запускаю его локально, чтобы что-то сделать на удаленном сервере (обозначается как "echo "Hi""). Однако, когда я запускаю его, я вижу подсказку на удаленном сервере - поэтому команда 'exit' не выполняется. Когда я вручную набираю "exit" в удаленном приглашении, я вижу, что "Соединение с 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 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
'"

Если я уберу двойные кавычки в этом фрагменте, я получу: bash: -c: option requires an argument а также date: Undefined variable.

4 ответа

Решение

Это должно решить вашу проблему.

ssh mylogin@myremotemachine.com << HERE
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
HERE

Или вы можете сделать следующее. Поместите все команды, которые вы хотите запустить на удаленном хосте, в отдельный скрипт. Дайте ему имя как remote.sh

Теперь запустите следующее

ssh mylogin@myremotemachine.com 'bash -s' < /path/to/remote.sh

Где удаленный.sh содержит.

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

Ты можешь сделать

$ssh user@comp echo abc<ENTER>

затем он запустит эту команду (выводит abc) и завершит работу

Может быть, у вас нет новой строки в конце скрипта?

Если нет пустой строки (точно LF - символ перевода строки) после выхода - ваш скрипт не будет "нажимать ввод" программно.

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

#!/bin/bash

ssh mylogin@myremotemachine.com "echo Hi\!"

Дополнительное чтение: я также предлагаю вам также изучить специальные символы и, когда вам нужно их избежать, поскольку bash будет автоматически анализировать восклицательные знаки, когда они заключены в двойные кавычки. Вы можете решить это, используя одинарные кавычки или символ обратной косой черты, чтобы "убежать" от него.

Редактировать:

#!/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 '
date=`date "+%Y-%m-%d"`
rm -f /u3/mylogin/backup/old_backup
ln -s $date\_backup /u3/mylogin/backup/old_backup
'

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

Другие вопросы по тегам