Как мне установить оболочку, которая используется, когда пользователь подключается к серверу по SSH. Например, я не переношу BASH и мне нужно использовать ZSH, как мне сделать так, чтобы ZSH загружался вместе с моим профилем ( .zsh_profile
), когда я подключаюсь к машине по SSH.
Я также не хочу передавать кучу параметров по ssh. Разве я не могу установить оболочку по умолчанию?
решение1
Если вы не можете изменить оболочку по умолчанию, ssh -t user@host 'zsh -l'
то это работает.
Флаг -t
принудительно выделяет псевдотерминал и -l
порождаетоболочка входа.
решение2
Если вы работаете в Linux, вы можете использовать chsh
команду.
chsh -s /bin/ksh foo
chsh -s /bin/bash username
решение3
man chsh
меняет оболочку, не всегда работает
В качестве альтернативы вы можете вставить exec /bin/zsh
свой скрипт входа в систему bash. Это заменит экземпляр bash на вашу оболочку.
Или вы можете сделатьssh host "zsh -l"
решение4
Я не уверен, как можно перенести локальный .zshrc
сервер на удаленный (без постоянного его хранения там), но у меня это работает, так как я могу изменить оболочку входа на удаленном сервере.
Поскольку это общий аккаунт, я могу использовать zsh
его только для себя.
Добавьте это в ~/.ssh/config
файл на локальном компьютере.
Host yourServer
HostName <IP, FQDN or DNS resolvable name>
IdentityFile ~/.ssh/<your keyfile>
RemoteCommand zsh -l
RequestTTY force
User <yourUsername>
Возможно, есть хакерский способ добиться того, что вы ищете, как показано ниже.
ПРЕДУПРЕЖДЕНИЕ Это не дает никаких гарантий и не выглядит «мудрым», однако мне удалось поместить свой локальный файл на сервер и использовать его в оболочке входа, используя это.
Host someHost
HostName someIP
IdentityFile ~/.ssh/somekey.pem
RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
PermitLocalCommand yes
LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
RequestTTY force
User someUser
Как это работает?
RemoteCommand
определяет, что необходимо запустить на удаленной стороне.LocalCommand
определяет, что должно быть запущено на локальном компьютере, который используется для копирования вашего локального файла на удаленный сервер для его получения. Вот в чем подвох, это происходит только после «успешного» подключения к удаленному хосту.
Значение:
- Ваше подключение к удаленному устройству должно быть открытым и активным.
- У вашей удаленной оболочки пока нет файла, поэтому ей придется подождать, пока файл появится, следовательно
sleep
- Ваш локальный сервер использует его
sftp
для помещения вашего файла на удаленный сервер, удаленный сервер активируетсяsleep
и берет ваши скрипты.
Это очень хакерский способ, мне бы хотелось узнать, есть ли способ получше.
Обновление: это можно использовать вместо «длительного» времени сна:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'