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

Вопрос или проблема

Я управляю группой серверов, поэтому мне часто приходится подключаться к ним по ssh. Я хотел бы автоматически запускать простой пользовательский скрипт на любом удалённом сервере после входа. Например, настроить некоторые алиасы, цвета для vim, PS1 и другие вещи.

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

Существуют похожие вопросы, но после выполнения скрипта ssh выходит. Как оставаться в системе?

Этот ответ довольно близок, однако новый bash -l, похоже, не регистрирует установленные переменные среды, такие как: ssh -t user@remote 'export PS1=myps1; bash -l'. Здесь PS1 не устанавливается в новом приглашении, возможно, из-за какой-то удалённой .bashrc

Как это может быть возможно?

Это довольно просто:

ssh [email protected] 'bash -s' < local_bash_script.sh

После выполнения скрипта local_bash_script.sh ssh-сессия будет сразу закрыта.

Обновление.

Если вы хотите выполнить что-то на удалённом сервере после входа по ssh, просто создайте файл rc. Создайте на удалённом сервере файл rc в каталоге .ssh пользователя:

touch ~/.ssh/rc

Откройте файл с помощью вашего любимого текстового редактора, например, nano:

nano ~/.ssh/rc

и скопируйте/вставьте содержимое скрипта:

#/bin/sh

date
whoami
uname -r

exit 0

Каждый раз при входе скрипт будет выполняться (замените date, whoami, uname -r на ваши команды).

Скрипт ~/.ssh/rc будет выполняться для конкретного пользователя, который является владельцем каталога, где находится файл rc. Если вы хотите выполнить скрипт rc для всех пользователей на удалённом сервере, создайте другой глобальный файл sshrc:

/etc/ssh/sshrc

Это всё.

Добавьте нужные команды в ваш ~/.bashrc.

В случае, если нужно проверить значение SSH_CLIENT/SSH_TTY, чтобы определить, подключены ли вы через ssh.

if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then ... ; fi

Проверьте Как я могу определить, управляется ли оболочка через SSH? для получения дополнительной информации

Вы можете проверить мой ответ здесь.

Так как я использую iTerm2, я придумал следующее:

Вы также можете иметь скрипт вроде ~/test.py

#!/usr/local/bin/python3

print("echo hello world")

А затем выполнить этот скрипт как подпроцесс в iTerm2 через меню Session->Run Co-Process, указав скрипт как ~/test.py

Я думаю, что необходимо сделать ваш скрипт исполняемым (хотя я этого не пробовал), chmod +x ~/test.py.

Счастливого кодинга!

Ответ или решение

Чтобы выполнить скрипт на удаленном сервере после подключения по SSH, необходимо учитывать несколько аспектов, учитывая требования сохранить активный сеанс после выполнения скрипта. Это может быть полезно, если вам нужно автоматически настроить окружение, например, задать алиасы, изменить PS1, или настроить цветовую схему Vim.

Теория

Стандартное выполнение команды через SSH обычно завершает сеанс после выполнения команды, как, например:

ssh user@remote 'bash -s' < local_bash_script.sh

Это связано с тем, что SSH возник для удаленного выполнения задач, и после выполнения команды оно завершается. Чтобы после выполнения скрипта оставаться в системе, нужно использовать методы, которые позволят эмулировать интерактивное поведение вместо однократного исполнения.

Пример

Для достижения нужного результата можно использовать два подхода:

  1. Использование SSH rc-файла: Вы можете создать файл rc в директории ~/.ssh/ удаленного пользователя. Любые команды, размещенные в этом файле, будут выполняться при каждом входе в систему. Однако это требует модификации на стороне сервера, что может быть нежелательно в вашем случае.

  2. Передача и исполнение команды с открытием интерактивного сеанса:

ssh -t user@remote 'export PS1="myps1"; source ~/set_aliases.sh; exec bash'

В этом примере, скрипт set_aliases.sh, содержащий нужные настройки, размещен на удаленном сервере. Использование -t обеспечивает псевдо-терминал, необходимый для интерактивного выполнения; exec bash запускает новый сеанс bash после выполнения скрипта, сохраняя изменения окружения.

Применение

Для использования описанных подходов выполните следующие шаги:

  1. Локально: подготовьте скрипт, содержащий ваши необходимые настройки, например, set_aliases.sh. Этот скрипт можно передать на сервер средствами SCP:

    scp set_aliases.sh user@remote:~
  2. Удаленно: запустите SSH с интерактивным терминалом и откройте новый сеанс bash:

    ssh -t user@remote 'source ~/set_aliases.sh; exec bash'

Это обеспечит запуск необходимых настроек при каждом подключении и сохранит ваш сеанс активным. Альтернативно, если возможно изменение конфигурации сервера, используйте файл ~/.ssh/rc, чтобы автоматизировать выполнение заданий на уровне сервера, но это требует права на изменения конфигурации на сервере.

Таким образом, вы получите гибкость в настройке окружения без потери интерактивности сеанса.

Оцените материал
Добавить комментарий

Капча загружается...