Wählen Sie die von SSH verwendete Shell?

31

Wie stelle ich die Shell ein, die verwendet wird, wenn ein Benutzer SSHs zu einem Server sendet? Zum Beispiel kann ich BASH nicht ausstehen und muss ZSH verwenden. Wie kann ich es so gestalten, dass ZSH zusammen mit meinem Profil ( .zsh_profile) geladen wird, wenn ich auf den Computer sshe .

Ich möchte auch nicht eine Reihe von Parametern mit ssh übergeben müssen. Kann ich nicht die Standard-Shell festlegen?

JP Silvashy
quelle

Antworten:

34

Angenommen, Sie arbeiten unter Linux, können Sie den chshBefehl verwenden.

chsh -s /bin/ksh foo
chsh -s /bin/bash username
Dominic Barnes
quelle
4
Bitte beachten Sie, dass der Pfad zur Binärdatei angegeben werden muss, damit /etc/shellsdie Shell ausgewählt werden kann.
Kimvais
Ubuntu 16.04 hat diesen Befehl nicht.
david.perez
@ david.perez Ja , es funktioniert, in dem passwdPaket .
Dessert
Dies funktioniert nicht, wenn die Authentifizierung über LDAP erfolgt
Daniel Kats
10

man chsh Wechselt die Shell, funktioniert nicht immer

Alternativ können Sie auch exec /bin/zshIhr Bash-Anmeldeskript verwenden. Dadurch wird die Bash-Instanz durch Ihre Shell ersetzt.

Oder du kannst es tun ssh host "zsh -l"


quelle
Warum die -1 (15 Zeichen ...)?
Noufal Ibrahim
das ist ein KleinbuchstabeL
Driftcatcher
1
ssh -tist erforderlich, um ein TTY für die letzten Optionen zu erhalten. Wenn ein Befehl (wie zsh -l) bereitgestellt wird, führt OpenSSH standardmäßig eine Nicht-Login-Shell aus, die Ihnen kein TTY zuweist, und -ländert dies nicht (da dies nach der Anmeldung ausgeführt wird).
Franklin Yu
8

Bearbeiten Sie / etc / passwd (wenn Sie die Rechte haben oder Ihren Systemadministrator fragen), um Ihre Standard-Shell zu ändern.

Valentin Rocher
quelle
Aus irgendeinem Grund hatten die Benutzer, die ich kürzlich erstellt habe, keine Standard-Shell. Das hat bei mir funktioniert. Vielen Dank.
Mimoralea
2
Danke, diese Antwort ist großartig. Ich hatte auch hier keine Muschel. Ich habe die Zeile myusername: x: 1000: 1000 :: / home / myusername: gefunden und am Ende / bin / bash hinzugefügt. Melden Sie sich ab und an, und meine SSH-Sitzung verwendet bash :)
Stewart Evans
6

Wenn Sie Ihre Standard-Shell nicht ändern können, ssh -t user@host 'zsh -l'funktioniert dies.

Das -tFlag erzwingt eine Pseudotty-Zuweisung und das -lFlag erzeugt eine Login-Shell .

Kennzeichen
quelle
4

Ich bin nicht sicher, wie Sie Ihren lokalen .zshrcServer auf einen Remote-Server übertragen können (ohne ihn dauerhaft dort zu speichern). Dies funktioniert für mich, wenn ich meine Anmeldeshell auf einem Remote-Server ändere.

Da es sich um ein freigegebenes Konto handelt, kann zshich es mit dieser Methode nur für mich selbst verwenden.

Fügen Sie dies zu Ihrer ~/.ssh/configDatei auf Ihrem lokalen Computer hinzu.

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

Es könnte einen hackigen Weg geben, um das zu erreichen, wonach Sie suchen, wie unten.

WARNUNG Dies kommt ohne Garantie und sieht nicht "klug" aus, aber ich habe es geschafft, meine lokale Datei auf den Server zu stellen und sie mit dieser in der Anmeldeshell zu speichern.

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

Wie es funktioniert?

  • RemoteCommand Definiert, was auf der Remote-Seite ausgeführt werden muss.
  • LocalCommandDefiniert, was lokal ausgeführt werden muss. Mit dieser Option wird Ihre lokale Datei auf den Remote-Server kopiert, um sie zu beziehen. Hier ist der Haken, es passiert erst nach "erfolgreicher" Verbindung zum Remote-Host.

Bedeutung:

  1. Ihre Verbindung zu Remote sollte offen und aktiv sein
  2. Ihre Remote-Shell hat die Datei noch nicht, daher muss sie warten, bis die Datei da ist, ergo sleep
  3. Ihre lokale Verwendung sftp, um Ihre Datei auf einem Remote-Server abzulegen, der Remote-Server wird von sleepIhren Skripten aktiviert und gibt einen Quellcode aus.

Es ist super hackisch, ich würde gerne wissen, ob es auch einen besseren Weg gibt.

Update: Dies kann anstelle von "langer" Ruhezeit verwendet werden:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

sdkks
quelle