Моя команда отвечает за тысячи машин Linux / Unix, поэтому, естественно, учетная запись root «разделяется» между администраторами. Я предпочитаю режим vi, другие предпочитают режим emacs.
Как я могу установить readline bash в режим vi при входе в SSH на любой машине, не заставляя всех остальных также использовать режим vi?
По сути, хотелось бы получить эффект set -o vi
после входа в систему, не вводя его каждый раз и не навязывая его всем остальным (насколько режим emacs меня раздражает, режим vi раздражает их).
Я знаю, что это не будет проблемой, если все будут использовать свои собственные учетные записи с sudo для выполнения привилегированных команд, но из-за обстоятельств, не зависящих от меня, это, к сожалению, не вариант.
set -o vi
прежде чем дать мне контроль над оболочкой.set -o vi
команду, а затем переключиться в интерактивный режим.sshd
устанавливает несколько переменных среды, которые могут помочь вам определить, кто находится на другом конце. Например,SSH_CLIENT
содержит подключающийся IP-адрес (а также исходящий / входящий порт клиента). Привязка к этому~/.bashrc
может позволить вам делать вещи только для вас .Ответы:
Вот глупый способ сделать это, который действительно хорошо работает только с аутентификацией с открытым ключом:
Во-первых, убедитесь, что на вашем локальном компьютере есть
nc
.Во-вторых, все еще на вашей локальной машине, сделайте скрипт (я его назову
connect-to-server
) и поместите его в место, о котором вы${PATH}
знаете *:Затем измените в
.bashrc
удаленной системе, чтобы включить где-то:Наконец, вернувшись на свой локальный компьютер, отредактируйте,
~/.ssh/config
чтобы добавить:Недостатки этого подхода (и почему я называю это глупым):
.yourname
файл еще не будет удален, и в этом случае ониset -o vi
тоже получат .ssh serverNickname command
, тоcommand
запустится, но (поскольку.bashrc
он никогда не получен).yourname
файл останется, поэтому было бы вежливо иметь второй псевдоним в конфигурации ssh, который не использует псевдопрокси.Фактически, единственным преимуществом этого подхода является то, что вашей
ssh
команде не нужно давать никаких дополнительных аргументов.* Если вы не хотите что-либо менять в удаленных системах, вот альтернативный псевдопрокси, который создает временный
.bashrc
:Это имеет те же недостатки, что и у другого метода, поэтому вам все равно нужен второй псевдоним в вашей
ssh
конфигурации, который не вызывает псевдопрокси.источник
Я бы пошел на:
но если вы администратор, вы можете попробовать что-нибудь почище. Например, вы можете использовать
SendEnv
опцию ssh на стороне клиента для передачи определенной переменной, использоватьAcceptEnv
вsshd
конфигурации (на стороне сервера) ее принятие и на основании этого изменить.bashrc
файл root, чтобы настроить поведение в соответствии со значением переменной.Это подразумевает изменение
sshd
конфигурации на всех хостах, а также их.bashrc
. Не совсем "автономный" способ сделать, однако ...источник
Для простого решения на стороне клиента:
Это не сработает , если при инициализации оболочки сценариев в корне явно , использует
set -o emacs
или наборыEDITOR
дляemacs
, или если корневого.initrc
файла вызываетemacs
привязки клавиш.Остальная часть этого ответа касается серверных решений.
Это работает, когда вы
ssh
входите в машину и затем используетеsudo -i
:Для вашего
/root/.bashrc
:Это позволяет вам иметь личный
bashrc
файл с именем, в/root/.bashrc-patrick
котором вы можете делать все что угодноset -o vi
.Комбинируя это с несколько наивным подходом к подбору этого файла rc в зависимости от
$SSH_CLIENT
:Очевидно, это работает, только если вы подключаетесь с одного и того же IP-адреса все время ...
Другой подход, который использует поле комментария конкретного используемого ключа SSH, который работает, если вы пересылаете агент SSH на сервер:
Это выбирает поле комментария для ключа, который вы использовали для подключения к серверу. Это
head -n 1
на тот случай, если вauthorized_keys
файле окажется несколько ключей .Затем вы можете использовать,
$ssh_comment
чтобы выбрать rc-файл для источника, либо напрямую, как в$SUDO_USER
подходе выше (в котором комментарий$ssh_comment
может нуждаться в некоторой очистке, если это путь), либо с помощьюcase
оператора, как в$SSH_CLIENT
подходе.источник
SSH_CLIENT
иSUDO_USER
то, что я использую в настоящее время, но это требует модификации на стороне сервера, и это не особенно надежно. Я надеялся на чисто клиентское решение. Спасибо за предложение, хотя.Если вы действительно хотите сделать это без изменений на стороне сервера, либо:
1) запустить что-то вроде
Я не думаю, что документация слишком ясна по этому поводу , но
-o option
упоминается и, кажется, работает.2) Используйте ожидайте:
expect
Скрипт:Сделайте его исполняемым и запустите:
Это предполагает, что вы можете войти без ввода паролей (для удаленного хоста или для ваших ключей), в противном случае ожидаемый сценарий должен будет принять это во внимание. Но с большим количеством машин вы, вероятно, уже имеете это. Кроме того, я ожидал знака доллара и пробела, отредактируйте это согласно вашей подсказке:
"# "
возможно.Хотя если что-то, напечатанное до приглашения, содержит те же символы, вам нужно будет включить в ожидаемую строку что-то более конкретное.
Кроме того, этот скрипт не поддерживает предоставление дополнительных аргументов
ssh
. Если вы собираетесь дать явную команду для запуска, вам, вероятно, не нужен режим vi, но если вам нужно, скажем, туннелирование портов, это может быть проблемой.Но в любом случае, я действительно думаю, что это должно быть решено на целевых системах с отдельными учетными записями (
sudo
или просто с простым старым UID 0). Персонализированная конфигурация будет полезна и для многих других случаев, и в целом у вас будет куча файлов конфигурации и переменных среды, которые вы хотите установить. (Учтите, что администраторы могут не согласиться с ценностью$EDITOR
, содержаниемvirc
или чем-либо еще.)Также удаление пользователей было бы проще с отдельными учетными записями.
Любой способ синхронизации файлов на всех хостах также легко решает эту проблему, позволяя вам войти в систему с помощью чего-то вроде
ssh -t user@host 'patricks_shell.sh'
илиssh -t user@host 'bash --rcfile patrick.rc'
.источник
interact
. Он не существует, приглашения могут быть разными, как и motds / выходные данные из профилей. Спасибо за предложение, хотя.Вы можете иметь собственный файл RC, следуя этому руководству:
Пользователь rc File | Secure Shell: полное руководство
или введите действие командной строки в ваш файл author_keys:
Конфигурация SSH автоматически выполнить удаленную команду | Unix & Linux Stack Exchange
источник