Запустіть віддалену команду ssh за допомогою Shell Full Login


48

Я хотів би зробити щось на зразок ssh example.com 'ls'Однак за ssh manpage:

Якщо вказана команда , вона виконується на віддаленому хості замість оболонки входу.

Отже, що відбувається, це lsвідображати його вихід, а потім ssh виходити.

Я не можу зрозуміти, як відкрити повну оболонку входу, а потім запустити команду всередині цієї оболонки. Залишаючи оболонку відкритою після виконання команди. Ніби я вручну зробив наступне:

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

Якісь ідеї?


це схоже запитання superuser.com/questions/261617/…, але жодна з відповідей насправді не відповідає тому, що я намагаюся зробити.
matthew

Як щодо ssh example.com 'ls;bash'?
Андрейс Кайніков

вам потрібна -i в моїх системах, щоб зробити другу оболонку інтерактивною.
Flexo

варіант - це відповідь на ваше запитання. Інші варіанти (наприклад, брелок) існують, але залежать від ваших реальних потреб, які мені недостатньо зрозумілі.
hornetbzz

@hornetbzz -t дає мені псевдо-tty. Але в іншому випадку поведінка однакова. Я хочу запустити інтерактивну оболонку, запустити команду всередині цієї оболонки і, щоб оболонка залишалася відкритою після запуску команди.
matthew

Відповіді:


40

Просто скажіть bash виконувати, lsа потім себе в оболонці входу

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

2
На жаль, це не працює під час використання screen. Інакше це здається, що це робить те, що я намагався зробити.
matthew

31
ssh user@host -t 'ls; exec $SHELL -l'

-tПримусове розподілення псевдотерміналів. Це можна використовувати для виконання довільних програм на екрані на віддаленій машині. Трохи правильніше, ніж bash -i.

exec Не створюється новий процес.

-lшукає ~ / .bash_profile, ~ / .bash_login та ~ / .profile у такому порядку та читає та виконує команди з ... Без цього ви, ймовірно, не можете запускати скрипти / команди з каталогу ~ / bin, тому що цей код from ~ / .profile не буде виконано без -lпрапора:

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

@grawity @Alan Це може працювати як спосіб вирішення, але мені дуже хочеться, щоб команда запускалася всередині оболонки, а не просто відкривала нову оболонку після виконання команди.
matthew

+1, -це, безумовно, правильний шлях подолати -і, я просто забув про це.
Flexo

@matthew: Вам доведеться латати bashсебе, щоб дозволити це.
grawity

@grawity не дуже, дивіться мою відповідь нижче
fons

@matthew, використовуй exec bashабоexec $SHELL
Євген Конков

1

У своєму коментарі до відповіді fons ви говорите, що він не працює під час використання screen.

Не могли б ви детальніше зупинитися на цьому? Дивлячись на вихідний код для openssh, sshd виконує команду за допомогою виклику

YOUR_DEFAULT_SHELL -c COMMAND

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

Якщо це ви намагаєтеся зробити, я думаю, що речі стануть дійсно дивними, оскільки screenви також закриєте вікна неінтерактивними програмами, тому вам доведеться робити аналогічний трюк, ніж у fons, але на один рівень глибше. Так, наприклад, / bin / bash (а не екран) як оболонка за замовчуванням Щось на зразок:

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

Що повинно - зробити глибокий вдих-- ssh в хост, запустіть bash -c з командою екрана, яка створить нове вікно. Якщо це вікно щойно відкрилося ls, воно закінчиться, а екран припиниться, тому ми використовуємо фокус fons всередині нового вікна екрана .

Я думаю, що це спрацює, якщо це навіть те, що ви намагалися зробити;)


Я думаю , що проблема у мене з screenв цій ситуації є те , що я зазвичай завантажити його exec screen -RRз My .profile. Це означає, що bash -lнамагається завантажити екран, який скидає решту. здається, я можу обійти його, видаливши '-l' як у вашому, так і в @fons-рішенні (ваше тоді залишає мене screen). Це свого роду химерка.
matthew

0

Опції з декількома параметрами примушують розподілити tty, навіть якщо ssh не має локальних tty:

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