Назад | Перейти на главную страницу

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

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

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

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

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

Эти изменения среды / каталога происходят после ssh, поэтому они не ограничиваются PermitUserEnvironment и сопутствующие настройки (точно так, как планировалось), но раньше .bashrc/.profile быть казненным. У этого есть плюсы и минусы - сложнее просто переопределить то, что устанавливается из сценариев инициализации bash, например 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 если ты хочешь это сделать)

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

if [ $SSH_TTY ]; then
    ...
fi

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

Из ssh страница руководства:

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

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

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

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

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

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