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

32

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

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

JP Silvashy
источник

Ответы:

35

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

chsh -s /bin/ksh foo
chsh -s /bin/bash username
Доминик Барнс
источник
4
Обратите внимание, что путь к двоичному файлу /etc/shellsдолжен быть указан для того, чтобы оболочка была выбираемой.
Кимваис
Ubuntu 16.04 не имеет этой команды.
Давид.перез
@ david.perez Да это делает, в на passwdупаковке .
десерт
Это не работает, когда аутентификация обрабатывается через LDAP
Даниэль Катс
11

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

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

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


источник
Почему -1 (15 символов ...)?
Нуфал Ибрагим
это строчные буквыL
driftcatcher
1
ssh -tтребуется, чтобы получить TTY для последних вариантов. По умолчанию, если указана команда (например zsh -l), OpenSSH будет выполнять оболочку без входа в систему, которая не будет выделять вам TTY, и -lне изменит это (потому что она выполняется после входа в систему).
Франклин Ю
8

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

Валентин Роше
источник
По некоторым причинам у пользователей, которых я недавно создал, не было оболочки по умолчанию. Это сработало для меня. Спасибо.
Mimoralea
2
Спасибо, этот ответ отличный. У меня здесь тоже не было снаряда. Я нашел строку myusername: x: 1000: 1000 :: / home / myusername: и добавил / bin / bash до конца. Выйдите и войдите, и моя сессия ssh использует bash :)
Стюарт Эванс
6

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

-tФлаг заставляет распределение псевдо-терминал, а -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'

sdkks
источник