Как автоматически запускать команды при входе в SSH?

18

Всякий раз, когда я захожу на свой сервер Linux, я хочу, чтобы несколько команд запускались автоматически (установить некоторые переменные, изменить местоположение и т. Д.)

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

Как я могу настроить это сделать это?

Алэсдэйр
источник
Вам необходимо прочитать раздел INVOCATION в bash (1) ( man bash).
Эндрю Шульман

Ответы:

31

Вставьте команды ~/.bashrc. Все, что там происходит, выполняется каждый раз, когда вы входите в систему.

Если вам нужно, чтобы команды выполнялись только при входе через ssh (но не при физическом входе в систему), вы, вероятно, можете проверить наличие SSH_CONNECTIONпеременной среды и запускать команды только в том случае, если вы обнаружите, что она существует.

Дэвид З
источник
Я не вхожу в систему как root, это сервер AWS, поэтому мне нужно войти в систему как «ec2-user», а затем перейти в root с помощью «sudo su -». Так я должен поместить команды в "/home/ec2-user/.bashrc"?
5
Это предполагает, что ~ / .bashrc получен из вашего ~ / .bash_profile. ~ / .bash_profile будет сценарий, который вызывается для оболочки входа, такой как ssh. Я полагаю, что ~ / .bashrc будет вызван, если вы откроете терминал Gnome, например, ПОСЛЕ того, как вы уже вошли в систему.
dgrant
Вы меня смутили, позвольте мне объяснить подробнее: это экземпляр Amazon Web Services, который фактически является сервером, поэтому никто никогда не будет физически входить в систему (я даже не уверен, существует ли он физически как одна машина). Я вхожу, используя PUTTY с именем пользователя ec2-user. Это сбрасывает меня в каталог / home / ec2-user. Затем я переключаюсь на пользователя root, набирая «sudo su -», после чего я перехожу в «/ root», затем мне приходится вводить ряд команд, в том числе меняя обратно на «/ home / ec2-user» и устанавливая некоторые переменные, псевдонимы и т. д. Итак ... как мне заставить это сделать?
Кроме того, так как я меняю пользователя, я ожидаю, что в профиле bash пользователя ec2 я должен указать только «sudo su -», а затем остальные команды в корневом файле bash?
ПРИМЕЧАНИЕ: на самом деле, .profile вызывается, если он существует, если только .bash_profile не существует, а затем вызывается.
День
14

Просто поместите это в ~ / .bashrc или /etc/bash.bashrc, если вы хотите это для всех пользователей:

if [[ -n $SSH_CONNECTION ]] ; then
    echo "I'm logged in remotely"
fi
Llamageddon
источник
и как я могу потерять сеанс после закрытия выполнения?
e-info128
1
@WHK Что вы имеете в виду, проиграв сессию?
Лламагеддон
@Llamageddon: Я думаю, что ему интересно то же самое, что и я. Если бы я хотел поместить весь мой сеанс SSH screen, я мог бы использовать ваш ответ и поместить screenего вместо эха. Проблема в том, что завершение сеанса экрана вернется к приглашению SSH вместо выхода из системы. Просто написание этого комментария дало мне ответ: добавьте logoutкоманду после screenкоманды.
zondo
Это, однако, не работает для сеанса ssh, который не использует bash, например, когда я открываю сеанс sftp.
Фабио
@zondo @ e-info128 exec commandзаменит текущую оболочку тем, что вы запускаете.
Лламагеддон
6

В качестве альтернативы, вы можете указать команду для запуска во время вызова ssh:

$ ssh -t server 'cmd; exec bash -l'

Последняя команда в списке должна начать интерактивный сеанс в вашей предпочтительной оболочке. Если вам нужно выполнить много команд, подумайте о создании файла сценария на вашем SSH-сервере.

Дмитрий Григорьев
источник
1
Это очень полезно. Не уверен, что это именно тот ответ, который задал спрашивающий, но люди должны знать об этом, поскольку это может быть неочевидно. Например, "ssh user @ host" export x = 5; bash "Тогда в терминале, который выскакивает, эхо $ x отображает 5.
clearlight
3

На самом деле ~/.ssh/rcэто подходящее место для вас , чтобы добавить команду для запуска , когда вы войти, а не любой пользователь системы.

 ~/.ssh/rc
         Commands in this file are executed by ssh when the user logs in,
         just before the user's shell (or command) is started.  See the
         sshd(8) manual page for more information.
Брук Хонг
источник
Не обязательно. Это место , где команды могут быть помещены.
Даниэль Б
Это может ДЕЙСТВИТЕЛЬНО привести к проблемам, если они не будут знать, что делают. Это потенциально полезно в угловых случаях, но это может ДЕЙСТВИТЕЛЬНО испортить кого-то, если они забудут, что они поместили туда команды или имя и путь к этому файлу. В целом, было бы весьма желательно поместить команды запуска при входе в ожидаемое место, .bashrc на удаленной стороне и проверить на $ SSH_CONNECTION, как предлагали другие ответы здесь.
ясный свет