45

Я хотел бы сделать что-то вроде ssh example.com 'ls' Однако для man-страницы ssh:

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

Итак, что происходит, так это то, что ls отображает вывод, а затем ssh завершает работу.

Я не могу понять, как открыть полную оболочку входа в систему, а затем запустить команду внутри этой оболочки. Оставляя оболочку открытой после выполнения команды. Как будто я вручную сделал следующее:

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

Есть идеи?

4 ответа4

39

Просто скажите bash выполнить ls а затем и себя в оболочке входа

$ ssh user@host  -t 'bash -l -c "ls;bash"'
30
ssh user@host -t 'ls; exec $SHELL -l'

-t Принудительное распределение псевдо-терминалов. Это может быть использовано для выполнения произвольных программ на экране на удаленном компьютере. Это немного более правильно, чем bash -i .

exec Новый процесс не создан.

-l ищет ~/.bash_profile, ~/.bash_login и ~/.profile в указанном порядке, а также читает и выполняет команды из ... Без этого вы, вероятно, не сможете запускать скрипты /команды из каталога ~/bin, потому что этот код из ~/.profile не будет выполняться без флага -l :

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
1

В своем комментарии к ответу fons вы говорите, что он не работает при использовании screen .

Не могли бы вы уточнить это? Глядя на исходный код openssh, sshd выполняет команду, вызывая

YOUR_DEFAULT_SHELL -c COMMAND

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

Если это то, что вы пытаетесь сделать, я думаю, что все будет действительно странно, так как screen также закроет окна с неинтерактивными программами, поэтому вам придется сделать аналогичный трюк с фонами, но на один уровень глубже. ТАК, с, например, /bin /bash (а не screen) в качестве оболочки по умолчанию Что-то вроде:

ssh user@host -t 'screen bash -l -c "ls;bash"'

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

Я думаю, что это сработает, если это даже то, что вы пытались сделать;)

0

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

ssh -tt user@host 'bash -l -c "/path/to/command'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .