Как изменить каталоги и задать параметры bash при входе на удаленный сервер через ssh?

Как изменить каталоги и задать параметры bash при входе на удаленный сервер через ssh?

Мне регулярно приходится входить на удаленные хосты через SSH, и мне нравится использовать опцию bash set -o vi, и мне обычно приходится cdвходить в определенный каталог. Поскольку эти хосты являются эфемерными (они регулярно создаются и уничтожаются), я не могу входить на них и сохранять их в .bash_profile/ .bashrc. Поэтому я искал, как я могу сделать это, когда я подключаюсь через SSH, чтобы мне не приходилось вводить одни и те же команды каждый раз, когда я подключаюсь к удаленному серверу. Я пробовал несколько способов добиться этого, но ни один из них, похоже, не работает. Может ли кто-нибудь помочь мне правильно написать эту команду? Вкратце, вот что я хочу сделать.

  1. cdв определенный каталог
  2. установите опцию bashset -o vi

Вот как я пытался это сделать:

ssh [email protected] -t "cd /data; exec bash --login -c \"set -o vi\""

Я думаю, что это действительно работает, но сеанс SSH завершается, потому что после set -o viвыполнения команды сеанс отключается с сообщением вроде:

Общее подключение к remotehost.com закрыто.

Есть ли способ сохранить сессию открытой после выполнения этих команд или есть другой способ добиться желаемого?

решение1

Некоторые варианты:

ssh -t [email protected] 'cd /data && exec bash --login -o vi'

(работает со всеми оболочками, подобными POSIX, включая ksh/ zsh/ dash..., поскольку -oявляется стандартной опцией утилиты POSIX shи, viкак оказалось, является одной из стандартных опций. Эта командная строка также совместима с оболочками всех основных семейств, включая Bourne, csh, rc, fish, поэтому должна работать независимо от оболочки входа пользователя root там)

Или:

сш -т[email protected]'cd /data && exec env SHELLOPTS=vi bash --login'

На самом деле, вы не хотите использовать этот второй. Это означает, что $SHELLOPTSпеременная будет в среде и повлияет на все bashвызовы (а неинтерактивные будут наследовать вызовы интерактивных оболочек, вызывая всевозможные проблемы).

Также имейте в виду, что bashесть два набора опций: один задается с помощью -o/ $SHELLOPTS, а другой — с помощью -O/ $BASHOPTS).

решение2

Сделайте это двумя командами.

  1. Поместите команды, которые будут выполнены на удаленном хосте, в файл .bashrc.tmp.
  2. $ scp .bashrc.tmp [email protected]:
  3. $ ssh <options> [email protected] "bash --login --rcfile ${HOME}/.bashrc.tmp"

Таким образом, вам даже не придется делать резервную копию исходного файла .bashrc.

решение3

Чтобы упростить переход из одной папки в другую на вашем хосте, вы можете установить apparix и настроить закладки в разных местах, куда вам нужно переходить, а затем использовать to folderXв apparix:https://micans.org/apparix/man/apparix.html

решение4

Я использую удаленную систему с общим идентификатором пользователя, поэтому я не хочу редактировать файлы запуска, так как это повлияет и на всех остальных. Ваш пост здесь показал мне, как установить viнужную мне опцию. Вот что я поместил в свой ~/.ssh/configфайл

Host testsystem
User tester
RequestTTY yes
RemoteCommand exec /bin/bash --login -o vi

что удивительно просто. Не знаю насчет части "cd", которую вы хотите.

Связанный контент