Вибір оболонки, яку використовує SSH?


31

Як встановити оболонку, яка використовується, коли користувальницькі SSH на сервер. Наприклад, я не витримую BASH і мені потрібно використовувати ZSH, як це зробити, щоб ZSH завантажувався разом із моїм профілем ( .zsh_profile), коли я сшу на машину.

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

Відповіді:


34

Якщо припустити, що ви працюєте в Linux, ви можете використовувати chshкоманду.

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

4
Зверніть увагу, що шлях до двійкового файлу повинен бути /etc/shellsпризначений для вибору оболонки.
Кімвай

Ubuntu 16.04 не має цієї команди.
david.perez

@ David.perez Так це робить, в на passwdупаковці .
десерт

Це не працює, коли автентифікація обробляється через LDAP
Daniel Kats

10

man chsh змінює оболонку, не завжди працює

Крім того, ви можете exec /bin/zshвставити у ваш скрипт входу bash.this замінить 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 :)
Стюарт Еванс


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'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.