Выбор оболочки, используемой SSH?

Выбор оболочки, используемой SSH?

Как мне установить оболочку, которая используется, когда пользователь подключается к серверу по 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определяет, что должно быть запущено на локальном компьютере, который используется для копирования вашего локального файла на удаленный сервер для его получения. Вот в чем подвох, это происходит только после «успешного» подключения к удаленному хосту.

Значение:

  1. Ваше подключение к удаленному устройству должно быть открытым и активным.
  2. У вашей удаленной оболочки пока нет файла, поэтому ей придется подождать, пока файл появится, следовательноsleep
  3. Ваш локальный сервер использует его sftpдля помещения вашего файла на удаленный сервер, удаленный сервер активируется sleepи берет ваши скрипты.

Это очень хакерский способ, мне бы хотелось узнать, есть ли способ получше.

Обновление: это можно использовать вместо «длительного» времени сна:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

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