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

Наблюдение & поскольку узел мог бы помочь: думайте о том, что Вы хотите сделать как взятие вывода 2, таким образом, 2>, и связь его вместе с 1, таким образом, 2>&1

11
15.09.2011, 02:44
2 ответа

Самый очевидный способ выполнить команду удаленно состоит в том, чтобы указать его на 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
15
27.01.2020, 19:58
  • 1
    Фантастический @Guilles. Ваши вклады в этот сайт делают это чрезвычайно полезным ресурсом для всех нас. Большое спасибо, действительно. Между прочим, я не знал о exec команда. Как exec zsh отличающийся от вызова zsh непосредственно? Почему это важно в данном случае? –  Amelio Vazquez-Reina 15.09.2011, 02:47
  • 2
    Хм, когда я работаю ssh -t shared-account@example.com 'HOME=~/bob; exec zsh' Я добираюсь HOME=~/bob: command not found. Я думаю, что иду tcsh. Я получаю ту же проблему, если я пробую HOME=/home/bob. Я примерил удар и zsh. Какие-либо подсказки, что может вызывать это? Наконец, был бы синтаксис выше оставлять меня с ssh сессией открытым? (что я хочу). Еще раз спасибо. –  Amelio Vazquez-Reina 15.09.2011, 03:04
  • 3
    @intrpc exec заменяет исходную оболочку zsh; без zsh, исходная оболочка осталась бы в памяти до zsh выходы и затем вышла бы. Основное различие сохраняет немного памяти, это не очень важно. Если Ваша оболочка входа в систему (t) csh, использовать setenv HOME ~/bob; exec zsh. Наконец, так как zsh запускается без аргумента, Вы получаете сессию оболочки, как Вы добрались бы, если бы Вы просто работали ssh и имел zsh как Вашу оболочку входа в систему. –  Gilles 'SO- stop being evil' 15.09.2011, 03:09
  • 4
    Еще раз спасибо за Вашу справку. Каждый развивает вопрос здесь. Любой способ выполнить больше команд, после exec zsh команда? –  Amelio Vazquez-Reina 06.10.2015, 03:05
  • 5
    @AmelioVazquez-Reina Не удобно, если Вы не имеете некоторый контроль над одним из точечных файлов. Можно установить переменную среды ZDOTDIR заставить zsh искать точечные файлы в другом каталоге. Если Вы действительно имеете некоторый контроль над точечными файлами затем, можно сделать что-то, любят, добавляют eval $LC_STARTUP_CODE кому: $ZDOTDIR/.zshrc и передайте код для выполнения в переменной среды LC_STARTUP_CODE. –  Gilles 'SO- stop being evil' 06.10.2015, 13:07

Для выполнения команды удаленно после подключения сервера добавьте в .ssh/config файле следующий отрывок

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*
-3
27.01.2020, 19:58
  • 1
    Спасибо @user626129, но как я упомянул в исходном вопросе LocalCommand директива должна выполнить команду на локальной оболочке, не на удаленной оболочке. –  Amelio Vazquez-Reina 15.09.2011, 01:56

Теги

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