Frage Wählen Sie die Shell, die SSH verwendet?


Wie setze ich die Shell, die verwendet wird, wenn ein Benutzer SSHs zu einem Server. Zum Beispiel kann ich BASH nicht ausstehen und brauche ZSH, wie mache ich es so, dass ZSH zusammen mit meinem Profil geladen wird (.zsh_profile) wenn ich an die Maschine ssh bin.

Ich möchte auch nicht eine Reihe von Parametern mit ssh übergeben, kann ich nicht die Standard-Shell einstellen?


23
2018-01-27 06:34


Ursprung




Antworten:


Angenommen, Sie arbeiten unter Linux, können Sie die chsh Befehl.

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

29
2018-01-27 06:36



Bitte beachten Sie, dass der Pfad zur Binärdatei enthalten sein muss /etc/shells damit die Schale auswählbar ist. - Kimvais
Ubuntu 16.04 hat diesen Befehl nicht. - david.perez
@ david.perez Ja, es tut, in das passwd Paket. - dessert
Dies funktioniert nicht, wenn die Authentifizierung über LDAP erfolgt - BlackSheep


man chsh Änderungen Shell, funktioniert nicht immer

Alternativ können Sie bleiben exec /bin/zsh in Ihrem Bash-Login script.this wird die Bash-Instanz durch Ihre Shell ersetzen.

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


9
2018-01-27 06:38



Warum die -1 (15 Zeichen ...)? - Noufal Ibrahim
Das ist ein Kleinbuchstabe L - hangtwenty
ssh -t ist erforderlich, um ein TTY für die letzten Optionen zu erhalten. Standardmäßig wenn ein Befehl (wie zsh -l) bereitgestellt wird, würde OpenSSH eine Nicht-Login-Shell ausführen, die TTY für Sie nicht zuweist, und -l wird das nicht ändern (weil das nach dem Einloggen ausgeführt wird). - Franklin Yu


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


7
2018-01-27 07:02



Aus irgendeinem Grund hatten die Benutzer, die ich kürzlich erstellte, keine Standard-Shell. Das hat für mich funktioniert. Vielen Dank. - mimoralea
Danke, diese Antwort ist großartig. Ich hatte auch keine Muschel hier. Ich fand die Zeile myusername: x: 1000: 1000 :: / home / myusername: und fügte am Ende / bin / bash hinzu. Abmelden und in und meine SSH-Sitzung verwendet Bash :) - Stewart Evans


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

Das -t Flag erzwingt eine Pseudo-Tty-Zuweisung, und die -l Flagge spawnt a Login-Shell.


4
2018-03-08 16:41





Ich bin mir nicht sicher, wie du dein Lokal einsetzen kannst .zshrc zum entfernten Server, (das ist, ohne es dort dauerhaft zu speichern), das funktioniert für mich, um meine Login-Shell auf dem entfernten Server zu ändern.

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

Fügen Sie das zu Ihrem hinzu ~/.ssh/config Datei auf Ihrem lokalen Rechner.

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

Es könnte hackischer Weg sein, um das zu erreichen, wonach Sie suchen, wie unten.

WARNUNG  Dies kommt ohne Garantien und sieht nicht "weise" aus, aber ich habe es geschafft, meine lokale Datei auf den Server zu legen und sie in der Login-Shell zu verwenden.

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.
  • LocalCommand definiert, was auf lokaler Ebene ausgeführt werden muss, um Ihre lokale Datei auf den Remote-Server zu kopieren und dort zu speichern. Hier ist der Haken, es passiert nur nach 'erfolgreicher' Verbindung zum entfernten Host.

Bedeutung:

  1. Ihre Verbindung zur Fernbedienung sollte offen und aktiv sein
  2. Ihre entfernte Shell hat die Datei noch nicht, also muss sie warten, bis die Datei da ist, ergo sleep
  3. Ihre lokalen Anwendungen sftp Um Ihre Datei auf den Remote-Server zu stellen, wacht der Remote-Server auf sleep und bezieht deine Skripte.

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

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


1
2018-06-11 05:39