сш с командой .... плюс оболочка - PullRequest
15 голосов
/ 28 октября 2009

Я хотел бы команду, которая ssh'es в машину, запускает команду (cd или выполнить сценарий или su), а затем дает мне оболочку. Передача команды в ssh, похоже, всегда завершается.

Некоторые примеры того, что я ищу: 'ssh me @ machine1 "./executeMyScript && cd / developmentDirectory"', а затем он возвращает мне мою оболочку.

Причины, по которым я хочу это сделать, в том, что я использую mrxvt (термины с вкладками x), которые позволяют мне определять команды для всех моих вкладок, которые будут выполняться при запуске. Я хотел бы иметь несколько соединений ssh ​​к одной и той же машине, но после них делать разные вещи.

1007 * Роб *

Спасибо!

Ответы [ 5 ]

10 голосов
/ 28 октября 2009

Вариация других ответов действительно, используйте опцию -t ssh для принудительного выделения псевдо-tty:

ssh -t me@machine ./executeMyScript '&&' bash -i
4 голосов
/ 28 октября 2009

Как насчет

    ssh me@machine ./executeMyScript '&&' bash -i

Вы должны заключить в кавычки &&, чтобы он был передан на удаленный компьютер, а не проглочен локальной оболочкой.

Цитируйте символ ';', и вы также можете изменить стартовый каталог:

    ssh me@machine ./executeMyScript '&&' cd /developmentDirectory ';' bash -i
2 голосов
/ 28 октября 2009

Как насчет использования опции SendEnv в ssh_config для отправки определенной опции среды с вашего локального компьютера на удаленный компьютер с последующей проверкой этой переменной среды в конфигурации удаленного узла?

В вашем .ssh / special-config-файле:

remotehost:
    SendEnv *

Ваш локальный скрипт:

RUN_THIS_FIRST_COMMAND=blah
ssh -F special-config-file

Ваш удаленный .bash_profile:

if [ "$RUN_THIS_FIRST_COMMAND" != "" ] ; then
    $RUN_THIS_FIRST_COMMAND
fi

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

2 голосов
/ 28 октября 2009

Поместите что-то вроде этого в конец скрипта, который вы хотите запустить:

bash -li

Это запускает Bash как интерактивную оболочку входа. Это не идеально, так как вы будете упускать такие вещи, как TERM пересылка, но это может быть адекватно вашим потребностям.

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

0 голосов
/ 08 августа 2014

Это работает для меня.

/usr/bin/ssh -t yourdomain.com "cd /directory; bash -i"
...