При запуске сеанса 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