Могу ли я где-нибудь ssh, выполнить несколько команд, а затем оставить себе подсказку? - PullRequest
28 голосов
/ 16 февраля 2012

Мне нужно войти на различные серверы, установить переменные среды, а затем работать в интерактивном режиме.

, например

$ ssh anvil
jla@anvil$ export V=hello
jla@anvil$ export W=world
jla@anvil$ echo $V $W
hello world

Как я могу объединить первые несколько команд, а затем оставить себя в приглашении?

Что-то вроде:

$ ssh anvil --on-login 'export V=hello; export W=world;'
jla@anvil$ echo $V $W
hello world

Очевидно, это проблема модели. На самом деле я спрашиваю: «Как мне запустить ssh на другом компьютере, выполнить некоторые команды, а затем продолжить, как если бы я запускал их вручную?»

Ответы [ 5 ]

29 голосов
/ 16 февраля 2012

Наверное, самая простая вещь:

$ ssh -t host 'cmd1; cmd2; sh -i'

Если вы хотите установить переменные, выполните:

$ ssh -t host 'cmd1; cmd2; FOO=hello sh -i'

Обратите внимание, что это ужасный хак, и вам было бы намного лучше поместить в скрипт нужные начальные команды и выполнить:

$ scp setup host:~
$ ssh host
host$ . setup
14 голосов
/ 16 февраля 2012

Вы также можете использовать следующий сценарий :

#!/usr/bin/expect -f
spawn ssh $argv
send "export V=hello\n"
send "export W=world\n"
send "echo \$V \$W\n"
interact
4 голосов
/ 16 февраля 2012

Оказывается, на этот вопрос ответили:

Как я могу ssh напрямую перейти в конкретный каталог?

в ssh:

ssh -t anvil "export V=hello; export W=world; bash"

с последующим:

jla@anvil$ echo $V $W
hello world
3 голосов
/ 04 октября 2016

Стоит отметить, что ssh -t действительно может использоваться для подключения к одному хосту через другой хост.

Так, например, если вы хотите выполнить команду на anvil , но anvil доступен только с хоста gateway (через межсетевой экран и т. Д.)), вы можете сделать это следующим образом:

ssh gateway -t 'ssh anvil -t "export V=hello; export W=world;bash -l";'

Выход из наковальня также приведет к выходу из шлюза (если вы хотите остаться на Проход после выхода из наковальни, чем просто добавить еще один bash -l до закрытия команды.

0 голосов
/ 15 июля 2018

Другой подход - казнить этого зверя (также дает мне цветную раковину):

ssh host -t "echo 'rm /tmp/initfile; source ~/.bashrc; cd foo/; git status' > /tmp/initfile; bash --init-file /tmp/initfile"

...