Запустить удаленную команду ssh с помощью полной оболочки входа в систему

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

  

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

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

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

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

Любые идеи?

ssh
42 голоса | спросил matthew 5 J000000Tuesday11 2011, 18:14:28

4 ответа


34

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

$ ssh [email protected]  -t 'bash -l -c "ls;bash"'
ответил fons 17 J000000Wednesday13 2013, 19:58:35
28
ssh [email protected] -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
ответил grawity 5 J000000Tuesday11 2011, 19:26:11
1

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

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

YOUR_DEFAULT_SHELL -c COMMAND

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

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

ssh [email protected] -t 'screen bash -l -c "ls;bash"'

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

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

ответил Scott Walls 23 J000000Tuesday13 2013, 05:00:05
0

Множественные опции tt выделяют tty, даже если ssh не имеет локального tty:

ssh -tt [email protected] 'bash -l -c "/path/to/command'
ответил panticz.de 26 Maypm18 2018, 22:31:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132