Запустите команду Remote SSH с помощью Full Login Shell


48

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

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

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

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

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

Есть идеи?


это похожий вопрос superuser.com/questions/261617/… но ни один из ответов на самом деле не соответствует тому, что я пытаюсь сделать.
Мэтью

Как насчет ssh example.com 'ls;bash'?
Андрейс Каиников

вам нужно -i в моих системах, чтобы сделать вторую оболочку интерактивной.
Флекс

опция -t это ответ на ваш вопрос. Существуют и другие варианты (например, связка ключей), но они зависят от ваших реальных потребностей, которые мне не совсем понятны.
hornetbzz

@hornetbzz -t дает мне псевдо-tty. Но в остальном поведение такое же. Я хочу запустить интерактивную оболочку, запустить команду внутри этой оболочки и оставить оболочку открытой после запуска команды.
Матфея

Ответы:


40

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

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

2
К сожалению, это не работает во время использования screen. В противном случае это похоже на то, что я пытался сделать.
Мэтью

31
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

@grawity @Alan Это может работать как обходной путь, но мне бы очень хотелось, чтобы команда запускалась внутри оболочки, а не просто открывала новую оболочку после запуска команды.
Матфея

+1, это определенно верный путь, я просто забыл об этом.
Флекс

@matthew: Вы должны будете залатать bashсебя, чтобы позволить это.
Гравитация

@ не очень, смотрите мой ответ ниже
фоны

@matthew, используйте exec bashилиexec $SHELL
Евгений Коньков

1

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

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

YOUR_DEFAULT_SHELL -c COMMAND

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

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

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

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

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


Я думаю, что проблема, с которой я сталкиваюсь screenв этой ситуации, состоит в том, что я обычно загружаю это exec screen -RRиз моего .profile. Это означает, что bash -lпытается загрузить экран, который сбрасывает все остальное. кажется, что я могу обойти это, удалив '-l' как в вашем, так и в @fons решениях (тогда ваше оставит меня screen). Это отчасти шатко.
Матфея

0

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

ssh -tt user@host 'bash -l -c "/path/to/command'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.