2013-08-29 2 views
95

Я пытаюсь найти команду UNIX или bash для запуска команды после подключения к ssh-серверу. Например:Запустить ssh и немедленно выполнить команду

ssh [email protected] "tmux list-sessions" 

Приведенный выше код работает, он перечисляет сеансы, но затем немедленно отключается. Помещение его в sshrc на стороне сервера работает, но мне нужно иметь возможность вводить его на стороне клиента. Я хочу иметь возможность запускать команду, она входит в систему, открывает окно, затем запускает команду, которую я установил. Ive пытался

[command] | ssh [email protected] 

ssh [email protected] [command] 

ssh [email protected] "[command]" 

ssh -t [email protected] [command] 
+2

Вы хотите запустить команду, а затем оставить ее в интерактивной оболочке на удаленном сервере? – Barmar

ответ

152
ssh -t 'command; bash -l' 

выполнит команду, а затем запустит оболочку входа, когда она будет завершена.

+1

Забыл мой собственный синтаксис, почти отказался от этого! Для кого-либо еще просто суффикс любой команды с помощью;; bash -l. Возможно, вы можете изменить его на «[команда]; bash -l 'или что-то для ясности? Я изменю свой вопрос. Благодаря! – cadlac

+4

Я думаю, что еще лучше «exec bash -l'. –

+0

Это здорово, но что, если вы хотите, чтобы команда отображалась в истории bash? – bsmoo

13

Вы можете использовать опцию LocalCommand командной строки, если опция PermitLocalCommand включена:

SSH имя пользователя @ имя хоста -о LocalCommand = "tmux список-сессии"

Для получения дополнительной информации о доступных параметрах см. Справочную страницу ssh_config.

+1

Это тоже сработало, я попробовал, и это позволит увеличить масштабируемость! Благодаря! – cadlac

+1

Для меня (OS X) это должно было быть 'ssh -o" LocalCommand tmux list-sessions "user @ hostname'. –

+8

Этот ответ основан на непонимании вопроса. Речь идет о запуске команды на удаленном сервере сразу после подключения. LocalCommand (как следует из названия) выполняет команду на локальном компьютере. – robo

5

Это не довольно, что вы ищете, но я нашел его полезным в подобных обстоятельствах.

Недавно я добавил следующее к моему $HOME/.bashrc (что-то подобное должно быть возможно с другими, чем Баш снарядов):

if [ -f $HOME/.add-screen-to-history ] ; then 
    history -s 'screen -dr' 
fi 

я храню сеанс screen работает на одной конкретной машине, и у меня были проблемы с ssh соединения с этой машиной, отбрасываемые, требуя, чтобы я повторно запускал screen -dr каждый раз, когда я снова подключаюсь.

С этим дополнением и после создания этого (пустого) файла в моем домашнем каталоге у меня автоматически появляется команда screen -dr в моей истории, когда начинается моя оболочка. После повторного подключения я могу просто ввести Control-PВведите, и я вернусь на сеанс экрана - или я могу игнорировать его. Это гибкий, но не довольно автоматический, и в вашем случае это проще, чем печатать tmux list-sessions.

Возможно, вы захотите сделать команду history -s безусловной.

Это требует обновления вашего $HOME/.bashrc на каждой из целевых систем, что может или не может сделать его непригодным для ваших целей.

+0

Это очень полезно, но я заметил, что история будет очищена, за исключением новой команды при новом входе в систему. Вы знаете, почему это происходит и как вы можете это предотвратить? Я только заметил, что после того, как я прокомментировал строку в .bashrc, теперь доступна полная история. – Andy

Смежные вопросы