ssh, запустити певну оболонку і запустити команду на віддаленій машині?


11

Я перебуваю в ситуації, коли декілька користувачів діляться одним і тим же обліковим записом користувача на віддаленій машині. У мене є "особистий" каталог, де я написав власний .zshrcфайл, і я хотів би мати спосіб:

  1. Запустіть сеанс ssh на віддаленій машині з директивами з мого файлу налаштування ssh (наприклад ControlMaster auto)
  2. Цей сеанс працює з оболонкою Z
  3. Він працює .zshrcв моєму "особистому" каталозі (не в домашній довідці спільного користувача)

Було б непогано мати псевдонім або простий спосіб запустити такі сеанси ssh (саме тому я подумав про використання конфігураційного файлу OpenSSH), але я відкритий до будь-яких інших ідей!

Використовуєте конфігураційний файл OpenSSH?

Я читаю на сторінці man ssh_config OpenSSH, що я можу використовувати директиву, LocalCommandщоб вказати команду для запуску локально після успішного підключення до сервера. Це змусило мене подумати, що може бути спосіб сказати configфайлу, яку команду запускати віддалено після підключення до сервера, але, схоже, їх немає.


Я не думаю, що ти можеш. Але я спантеличений, чому ви цього хочете. У командному рядку ssh вже є команда. Чому ти не можеш бігати ssh mycommand? І якщо ви хочете виконати якусь команду настройки перед кожною командою, що надходить через ssh, чому б не налаштувати сторону сервера?
Жил 'ТАК - перестань бути злим'

Дякую @Guilles. Я знаходжусь у ситуації, коли декілька користувачів діляться одним і тим же віддаленим обліковим записом, тому я хотів би швидко налаштувати кілька речей під час віддаленого входу. Більш конкретно, я хотів би запустити оболонку Z і попросити її запустити .zshrcв певний каталог (тобто "особистий" домашній каталог). Я спробував, ssh -t host_name 'zsh & source /path/to/my_zshrc'але це не вийшло (я отримав FPATH variable not defined, і я думаю, що це тому, що zshзакінчується до запуску my_zshrc, не кажучи вже про це не дав мені оболонки Z)
Амеліо Васкес-Рейна

Я думаю, що це заслуговує на оновлення ОП, тому я просто оновив його.
Амеліо Васкес-Рейна

Шукаючи подібну мою відповідь, мені здається, що це питання досить близьке до того, що ви намагаєтеся зробити.
Жил "ТАК - перестань бути злим"

Відповіді:


15

Найбільш очевидний спосіб запустити команду віддалено - вказати її в командному рядку ssh. Команда ssh завжди інтерпретується оболонкою віддаленого користувача.

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

Спільні акаунти, як правило, погана ідея; якщо це можливо, отримайте окремі облікові записи для кожного користувача. Якщо у вас є спільний обліковий запис, ви можете зробити псевдонім:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

Якщо ви використовуєте автентифікацію відкритих ключів (знову ж таки, рекомендовано), ви можете визначити команди на ключ ~/.ssh/authorized_keys. Дивіться цю відповідь для отримання додаткових пояснень. Відредагуйте рядок для вашого ключа ~/.ssh/authorized_keysна сервері (усі в одному рядку):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

Фантастичний @Guilles. Ваш внесок на цей сайт робить його надзвичайно корисним ресурсом для всіх нас. Дуже дякую, справді. До речі, я не знав про execкоманду. Чим exec zshвідрізняється від zshпрямого дзвінка ? Чому це важливо саме в цьому випадку?
Амеліо Васкес-Рейна

Хм, коли бігаю, ssh -t shared-account@example.com 'HOME=~/bob; exec zsh'отримую HOME=~/bob: command not found. Я думаю, що я на tcsh. У мене виникає така ж проблема, якщо я спробую HOME=/home/bob. Я приміряв bash і zsh. Будь-які підказки, що може бути причиною цього? Нарешті, чи залишив би синтаксис вище відкритий сеанс ssh? (що я хочу). Знову дякую.
Амеліо Васкес-Рейна

1
@intrpc execзамінює оригінальну оболонку на zsh; без zshцього оригінальна оболонка залишиться в пам'яті, поки zsh не вийде, а потім не вийде. Головна відмінність - це збереження трохи пам’яті, це не дуже важливо. Якщо ваша оболонка для входу - (t) csh, використовуйте setenv HOME ~/bob; exec zsh. Нарешті, оскільки zsh запускається без аргументу, ви отримуєте сеанс оболонки, як у вас, якби ви тільки запустили sshта отримали zsh як оболонку входу.
Жил 'ТАК - перестань бути злим'

Ще раз дякую за вашу допомогу. Одне наступне запитання тут. Будь-який спосіб запустити більше команд після exec zshкоманди?
Амеліо Васкес-Рейна

1
@ AmelioVazquez-Reina Не зручно, якщо ви не маєте контролю над одним із точкових файлів. Ви можете встановити змінну середовища, ZDOTDIRщоб змусити zsh шукати крапкові файли в іншому каталозі. Якщо у вас є певний контроль над точковими файлами , то ви можете зробити що - щось на зразок доповнення eval $LC_STARTUP_CODEдо $ZDOTDIR/.zshrcі передати код для виконання в змінному оточенні LC_STARTUP_CODE.
Жиль "ТАК - перестань бути злим"

-3

Щоб запустити команду віддалено після підключення сервера, додайте у свій .ssh / config файл наступний фрагмент

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
Дякуємо @ user626129, але, як я вже згадував в оригінальному запитанні, LocalCommandдиректива полягає у виконанні команди на локальній оболонці, а не на віддаленій оболонці.
Амеліо Васкес-Рейна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.