Назад | Перейти на главную страницу

Выбираете оболочку, которую использует SSH?

Как установить оболочку, которая будет использоваться при подключении пользователя к серверу по SSH. Например, я терпеть не могу BASH и мне нужно использовать ZSH, как мне сделать так, чтобы ZSH загружался вместе с моим профилем (.zsh_profile) когда я подключаюсь к машине по ssh.

Я тоже не хочу передавать кучу параметров с помощью ssh, нельзя ли установить оболочку по умолчанию?

Предполагая, что вы работаете в Linux, вы можете использовать chsh команда.

chsh -s /bin/ksh foo
chsh -s /bin/bash username

man chsh меняет оболочку, не всегда работает

Как вариант, можно наклеить exec /bin/zsh в вашем сценарии входа в bash. это заменит экземпляр bash на вашу оболочку.

Или ты можешь сделать ssh host "zsh -l"

Отредактируйте / etc / passwd (если у вас есть права или обратитесь к системному администратору), чтобы изменить оболочку по умолчанию.

Если вы не можете изменить оболочку по умолчанию, ssh -t user@host 'zsh -l' работает.

В -t флаг заставляет выделение псевдо-tty, а -l флаг порождает оболочка входа.

Я не уверен, как можно поставить местный .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'