
Мне регулярно приходится входить на удаленные хосты через SSH, и мне нравится использовать опцию bash set -o vi
, и мне обычно приходится cd
входить в определенный каталог. Поскольку эти хосты являются эфемерными (они регулярно создаются и уничтожаются), я не могу входить на них и сохранять их в .bash_profile
/ .bashrc
. Поэтому я искал, как я могу сделать это, когда я подключаюсь через SSH, чтобы мне не приходилось вводить одни и те же команды каждый раз, когда я подключаюсь к удаленному серверу. Я пробовал несколько способов добиться этого, но ни один из них, похоже, не работает. Может ли кто-нибудь помочь мне правильно написать эту команду? Вкратце, вот что я хочу сделать.
cd
в определенный каталог- установите опцию bash
set -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
Сделайте это двумя командами.
- Поместите команды, которые будут выполнены на удаленном хосте, в файл
.bashrc.tmp
. $ scp .bashrc.tmp [email protected]:
$ 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", которую вы хотите.