Могу ли я выполнить некоторые команды при запуске сеанса ssh перед переходом в интерактивный режим?


13

При запуске сеанса ssh с помощью команды ssh у меня, кажется, есть два варианта - интерактивный сеанс по умолчанию с env по умолчанию и запуск из домашнего каталога - или выполнение произвольной команды, но не в интерактивном режиме (даже такие приемы, как ssh "command; command; bash -i -l", похоже, не очень полезны). Довольно часто я хочу интерактивный сеанс, но с чем-то, что происходит до этого - обычно смена каталога или иногда настройка системной среды. Эти вещи будут меняться от сессии к сессии, поэтому я не могу просто вставить их .bashrcили около того.

Есть ли способ сделать это?

Ответы:


13

Я отвечаю сам за себя, так как наконец-то открыл секрет. Ни -tопция ssh, ни -lопция bashне приведут к входу в оболочку самостоятельно - но в комбинации они работают.

ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'изменяет каталог, устанавливает переменные окружения, а затем запускает надлежащую оболочку входа в систему (единственное различие, которое я обнаружил до сих пор, заключается в том, что /etc/motdне отображается таким образом - обычно sshэто loginответственность или не ответственность, а bashне то, что все кажется работать отлично, и все переменные среды идентичны).

Эти изменения среды / каталога происходят после ssh, поэтому они не ограничены PermitUserEnvironmentсоответствующими настройками (точно так, как запланировано), но перед выполнением .bashrc/ .profileget. У этого есть свои плюсы и минусы - сложнее просто переопределить что-то, что устанавливается из сценариев bash init PS1, но проще упаковать правильные значения в sshкомандные строки и .profileвыполнить всю тяжелую работу.

И если это действительно необходимо, на самом деле довольно легко заставить bash выполнить что-то после .profileс помощью командной строки, как ssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- очень уродливо, если говорить таким образом, но эти альтернативные .profileфайлы можно подготовить раньше. (насколько я могу судить, у bashнего есть несколько возможных мест для .profileсценария, и он выполнит первый найденный - . fileтаких автоматических откатов нет, поэтому вам нужно проверить, где вы profileнаходитесь, если вы хотите это сделать)


Круто, спасибо за это! Я искал способ ввести su в учетную запись пользователя сразу после входа в ssh, и опция -t заставила его работать. Без этой опции ваша оболочка не имеет приглашения, не имеет истории команд, умирает от SIGINT и т. Д.
Ashoat

Этот ответ действительно полезен, но вам не хватает нескольких ;секунд из первой строки входа в систему ssh. Это не позволит мне отредактировать ваш ответ, потому что я недостаточно меняюсь. Я получил это на работу ssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'. Я думаю, это то, что вы хотели.
Роб Квасовский

2

Отредактируйте .bashrc и включите параметры среды, специфичные для SSH, в:

if [ $SSH_TTY ]; then
    ...
fi

Это позволит вам добавить настройки специально для сессий SSH. «Конечно, если все, что вам нужно, это установить произвольные переменные окружения в самом начале, которые различаются в зависимости от сеанса, я не знаю, как вы можете заставить машину угадывать их для вас, кроме того, чтобы печатать их… независимо от того, что, вы» Вам понадобятся некоторые проверяемые условия для выбора параметров.


2

Со sshстраницы руководства :

Кроме того, ssh читает ~ / .ssh / environment и добавляет строки формата «VARNAME = значение» в среду, если файл существует, и пользователям разрешено изменять свою среду. Для получения дополнительной информации см. Параметр PermitUserEnvironment в sshd_config (5).

который говорит:

PermitUserEnvironment
Указывает, обрабатываются ли sshd (8) параметры ~ / .ssh / environment и environment = в ~ / .ssh / authorized_keys. По умолчанию «нет». Включение обработки среды может позволить пользователям обойти ограничения доступа в некоторых конфигурациях, используя такие механизмы, как LD_PRELOAD.

Это средство можно использовать для условного выполнения операторов на вашем пульте, ~/.bashrcиспользуя ifструктуру, предложенную Микки .


1

Просто беги так: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : так что подсказка sh'а появится
  • ; bash: так что он должен вернуть обратно элемент управления, несмотря на выполнение команды (здесь cd) и выход из сеанса SSH

Добро пожаловать в ServerFault! Пожалуйста, предоставьте и объяснение и / или документацию для команд или сценариев, чтобы объяснить, для чего они.
Кори Кнутсон

1
Спасибо @CoryKnutson, я сделал изменения, как вы просили
Sumit Ramteke
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.