shell-скрипты удаленных команд через ssh

Я пытаюсь создать сценарий оболочки, который будет выполнять некоторые команды, которые мне требуются часто. Я сделал ssh login, чтобы пропустить запрос пароля с использованием пары открытого / закрытого ключа. и после некоторого поиска я могу выполнить некоторые коды, например:

Файл: ssh.sh

ssh -X root@172.16.0.1 << EOF cd /root/myDir gedit ac bc EOF 

Но я не вижу никакой разницы, если бы поставил:

 ssh -X root@172.16.0.1 << EOF cd /root/myDir gedit ac bc & EOF 

& Не имеет никакого значения. С & , как правило, после выполнения gedit, он будет отправлен на задний план и появится подсказка. Но я не получаю подсказку после gedit. (Хотя все, что есть в следующей строке, выполняется. Например, если я помещаю echo "Hello" , он отображает Hello .)

Что здесь не так? Есть ли другой метод? Я хочу сделать SSH и выполнить некоторую команду через скрипт оболочки. Но я не хочу выходить из системы после завершения сценария оболочки. Я хочу выйти из системы вручную после выполнения некоторых моих собственных команд, которые не повторяются, как в приведенном выше скрипте.

Без & сценарий, который вы выполняете удаленно, говорит: «измените на /root/myDir , затем выполните gedit и дождитесь его выхода». Вариант с & говорит, чтобы не ждать выхода gedit . В любом случае, оболочка завершает работу после выполнения последней команды в скрипте.

Если вы хотите выполнить скрипт и затем выполнить больше команд, которые вы вводите в интерактивном режиме, вам нужно выполнить интерактивную оболочку в конце.

 ssh -Xt root@172.16.0.1 'cd /root/myDir && gedit ac bc; exec bash' 

Опция -t сообщает SSH о настройке виртуального терминала на сервере; по умолчанию он не делает этого, когда вы передаете удаленную команду для выполнения. exec bash в конце говорит оболочке заменить себя новым экземпляром bash, который будет интерактивной оболочкой (показывая приглашение, прослушивая ваши команды и т. д.), поскольку его вход поступает с терминала.

Вы можете определить function а затем выполнить ее над ssh .

 #!/bin/bash ssh_func(){ cd /root/myDir gedit ac bc } ssh -X root@172.16.0.1 "$(typeset -f); ssh_func" 

typeset -f будет отображать функции, определенные в скрипте.