Могу ли я выполнить некоторые команды при запуске сеанса 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