Auswählen der von SSH verwendeten Shell?

Auswählen der von SSH verwendeten Shell?

Wie stelle ich die Shell ein, die verwendet wird, wenn ein Benutzer per SSH auf einen Server zugreift? Ich kann beispielsweise BASH nicht ausstehen und muss ZSH verwenden. Wie stelle ich es ein, dass ZSH zusammen mit meinem Profil ( .zsh_profile) geladen wird, wenn ich per SSH auf die Maschine zugreife?

Ich möchte mit SSH auch nicht eine Menge Parameter übergeben müssen. Kann ich nicht die Standard-Shell festlegen?

Antwort1

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

Das -tFlag erzwingt eine Pseudo-TTY-Zuweisung und -lerzeugt einAnmeldeshell.

Antwort2

Vorausgesetzt, Sie verwenden Linux, können Sie den chshBefehl verwenden.

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

Antwort3

man chshwechselt die Shell, funktioniert nicht immer

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

Oder Sie könnenssh host "zsh -l"

Antwort4

Ich bin nicht sicher, wie Sie Ihr lokales Konto .zshrcauf einen Remote-Server übertragen können (ohne es dort dauerhaft zu speichern). Bei mir funktioniert es, meine Login-Shell auf dem Remote-Server zu ändern.

Da es sich um ein gemeinsam genutztes Konto handelt, kann ich zshdiese Methode nur für mich selbst verwenden.

Fügen Sie dies 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 Hacker-Weg geben, um das Gesuchte zu erreichen, wie unten.

WARNUNG Dies geschieht ohne Garantie und sieht nicht „klug“ aus, ich habe es jedoch geschafft, meine lokale Datei auf den Server zu stellen und sie mithilfe dieser Funktion in der Login-Shell als Quelle 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?

  • RemoteCommanddefiniert, was auf der Remote-Seite ausgeführt werden muss.
  • LocalCommanddefiniert, was lokal ausgeführt werden muss, um Ihre lokale Datei zum Abrufen auf den Remote-Server zu kopieren. Dabei ist der Haken: Dies geschieht erst nach einer „erfolgreichen“ Verbindung zum Remote-Host.

Bedeutung:

  1. Ihre Verbindung zur Remote-Remote sollte offen und aktiv sein
  2. Ihre Remote-Shell hat die Datei noch nicht, also muss sie warten, bis die Datei da ist, ergosleep
  3. Ihr lokaler Server sftplegt Ihre Datei auf dem Remote-Server ab, der Remote-Server wird aktiviert sleepund bezieht Ihre Skripte.

Das ist totaler Hack, ich wüsste auch gerne, ob es einen besseren Weg gibt.

Update: Dies kann anstelle einer „langen“ Schlafenszeit verwendet werden:
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

verwandte Informationen