Wybieranie powłoki używanej przez SSH?

31

Jak ustawić powłokę używaną, gdy SSH użytkownika do serwera. Na przykład nie mogę znieść BASH i muszę używać ZSH, jak to zrobić, aby ZSH był ładowany wraz z moim profilem ( .zsh_profile), gdy ssh na maszynę.

Nie chcę też przekazywać wiązki parametrów za pomocą ssh, czy nie mogę ustawić domyślnej powłoki?

JP Silvashy
źródło

Odpowiedzi:

34

Zakładając, że korzystasz z systemu Linux, możesz użyć chshpolecenia.

chsh -s /bin/ksh foo
chsh -s /bin/bash username
Dominic Barnes
źródło
4
Należy pamiętać, że ścieżka do pliku binarnego musi znajdować się, /etc/shellsaby powłoka była dostępna do wyboru.
Kimvais,
Ubuntu 16.04 nie ma tego polecenia.
david.perez
@ david.perez Tak to robi, w tym passwdpakiecie .
deser
To nie działa, gdy uwierzytelnianie jest obsługiwane przez LDAP
Daniel Kats,
10

man chsh zmienia powłokę, nie zawsze działa

Alternatywnie możesz exec /bin/zshwłożyć skrypt logowania do bash. To zastąpi instancję bash z powłoką.

Lub możesz to zrobić ssh host "zsh -l"


źródło
Dlaczego -1 (15 znaków ...)?
Noufal Ibrahim
to jest mała literaL
driftcatcher
1
ssh -tjest wymagane, aby uzyskać TTY dla ostatnich opcji. Domyślnie, jeśli zsh -lpodano polecenie (podobne ), OpenSSH wykonałby powłokę niezalogowaną, która nie przydzieliłaby TTY dla ciebie i -lnie zmieniłaby tego (ponieważ jest to wykonywane po zalogowaniu).
Franklin Yu,
8

Edytuj / etc / passwd (jeśli masz uprawnienia lub poproś administratora systemu) o zmianę domyślnej powłoki.

Valentin Rocher
źródło
Z jakiegoś powodu użytkownicy, których ostatnio stworzyłem, nie mieli domyślnej powłoki. To zadziałało dla mnie. Dzięki.
mimoralea
2
Dzięki, ta odpowiedź jest świetna. Nie miałem tu też muszli. Znalazłem wiersz myusername: x: 1000: 1000 :: / home / myusername: i dodałem / bin / bash na końcu. Wyloguj się i zaloguj, a moja sesja ssh używa bash :)
Stewart Evans,
6

Jeśli nie możesz zmienić domyślnej powłoki, ssh -t user@host 'zsh -l'działa.

-tFlaga wymusza podział pseudo-tty, a -ltarła flagę powłokę logowania .

znak
źródło
4

Nie jestem pewien, w jaki sposób możesz przenieść swój lokalny .zshrcserwer na serwer zdalny (to bez trwałego przechowywania go tam), to działa dla mnie, aby zmienić moją powłokę logowania na serwerze zdalnym.

Ponieważ jest to wspólne konto, mogę używać zshtej metody tylko dla siebie.

Dodaj to do ~/.ssh/configpliku na komputerze lokalnym.

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

Może być hackerski sposób na osiągnięcie tego, czego szukasz, na przykład poniżej.

OSTRZEŻENIE Nie ma żadnych gwarancji i nie wygląda na „mądre”, ale udało mi się umieścić mój plik lokalny na serwerze i użyć go w powłoce logowania.

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

Jak to działa?

  • RemoteCommand określa, co należy uruchomić po zdalnej stronie.
  • LocalCommandokreśla, co należy uruchomić na komputerze lokalnym, który służy do kopiowania pliku lokalnego na serwer zdalny w celu uzyskania go. Oto haczyk, dzieje się to dopiero po „udanym” połączeniu ze zdalnym hostem.

Znaczenie:

  1. Twoje połączenie z pilotem powinno być otwarte i żywe
  2. Twoja zdalna powłoka jeszcze nie ma pliku, więc musi poczekać, aż plik się pojawi, ergo sleep
  3. Lokalne zastosowania sftpdo umieszczenia pliku na serwerze zdalnym, serwer zdalny budzi się sleepi źródle skryptów.

To jest super hackerskie, chciałbym wiedzieć, czy jest też lepszy sposób.

Aktualizacja: Można tego użyć zamiast „długiego” czasu snu:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

sdkks
źródło