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 -t
Flag erzwingt eine Pseudo-TTY-Zuweisung und -l
erzeugt einAnmeldeshell.
Antwort2
Vorausgesetzt, Sie verwenden Linux, können Sie den chsh
Befehl verwenden.
chsh -s /bin/ksh foo
chsh -s /bin/bash username
Antwort3
man chsh
wechselt die Shell, funktioniert nicht immer
Alternativ können Sie exec /bin/zsh
Ihr 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 .zshrc
auf 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 zsh
diese Methode nur für mich selbst verwenden.
Fügen Sie dies Ihrer ~/.ssh/config
Datei 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?
RemoteCommand
definiert, was auf der Remote-Seite ausgeführt werden muss.LocalCommand
definiert, 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:
- Ihre Verbindung zur Remote-Remote sollte offen und aktiv sein
- Ihre Remote-Shell hat die Datei noch nicht, also muss sie warten, bis die Datei da ist, ergo
sleep
- Ihr lokaler Server
sftp
legt Ihre Datei auf dem Remote-Server ab, der Remote-Server wird aktiviertsleep
und 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'