Я хочу, чтобы SSH на удаленном сервере и запустить ряд команд, таких как (только некоторые случайные команды)

touch foo.txt
echo 'bar' > foo.txt
cd ..
ls

и оставайся в этой связи.

Кто-то предложил мне использовать ssh -t $server "commands; bash" . Это сработало, но оказалось в другом каталоге, чем если бы я просто делал ssh $server . Есть идеи, почему это происходит?

(Я изучаю существующий код в репозитории, поэтому мне интересно, что это за механизм и почему)

1 ответ1

0

Есть идеи, почему это происходит?

Может быть, ваши commands включают cd . Вы выполняете commands; bash , поэтому bash запускается в любом конце каталога commands .

Очевидное решение состоит в cd назад как раз перед тем, как вызвать bash Пытаться

ssh -t $server 'commands; cd "$HOME"; exec bash -l'

Заметки:

  • Одиночные кавычки мешают локальному расширению $HOME ; если вам нужны commands для включения локально раскрываемых переменных, смешайте кавычки (например, "commands with $var; "'cd "$HOME"; exec bash -l').
  • exec , потому что вам больше не нужна родительская оболочка на удаленной стороне (или вам?).
  • -l (эквивалентно --login), потому что единственный ssh $server порождает оболочку входа в систему, и вы хотите, чтобы вся ваша команда действовала одинаково. Bash в качестве оболочки входа в систему использует файлы, отличные от оболочки, не входящей в систему, начиная с /etc/profile ; правила несколько сложны, смотрите man 1 bash , ищите INVOCATION . Если один из этих файлов выполняет cd в другой каталог, вы получите то, что получите, даже если commands не меняют каталог. Вы не сказали, что такое каталоги ("правильный" и "неправильный"), поэтому трудно даже догадаться, какова цель этого "скрытого" cd .

Или вы можете запускать commands в подоболочке. Это не повлияет на рабочий каталог родительской оболочки, поэтому bash будет запускаться везде, где запускается родительская оболочка:

ssh -t $server '(commands); exec bash -l'

Вы можете предпочесть одно решение или другое в зависимости от того, что делают commands . Например, если commands изменяют среду своей оболочки на удаленной стороне, то запуск их в подоболочке или нет имеет значение для окончательного варианта bash .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .