Gibt es eine Möglichkeit, SSH zu zwingen, eine bestimmte Shell auf der Remote-Seite zu verwenden, unabhängig von der Standard-Shell des Benutzers?
Ich habe Lösungen ausprobiert, die den folgenden ähneln:
ssh host.domain.com /bin/bash -c 'complicated, multi-line command'
Leider ist die Standard-Shell auf der Remote-Seite für das Parsen des Teils "Komplizierter Befehl mit mehreren Zeilen" verantwortlich, und ich habe Schwierigkeiten, ihn ausreichend zu maskieren, um sowohl für Bash- als auch C-Shell-Benutzer zu funktionieren.
ssh
bash
shell
command-line-interface
Plinehan
quelle
quelle
Antworten:
Ich glaube nicht, dass dies möglich ist, zumindest bei OpenSh-basierten Systemen. Wenn Sie die Möglichkeit haben, ist es möglicherweise eine bessere Lösung, eine Shell-Skript-Datei zu speichern und sie dann mit der von Ihnen angegebenen Methode auszuführen. Dies hätte den Vorteil, dass die benötigte Escape-Zeit minimiert würde, aber eine Datei zurückbleiben würde, die entfernt werden müsste (möglicherweise als letzter Schritt des Skripts).
quelle
Benutze einen Heredoc:
quelle
cat /tmp/tempfile_containing_your_script ssh ${hostname} /bin/bash
. Anstelle eines Schritts haben Sie also zwei Schritte: Schritt 1 Kopieren Sie Ihr Skript in eine Datei, Schritt 2cat
das Skript inssh
.Verwenden Sie nicht kennwortbasierte, sondern schlüsselbasierte Anmeldungen. Anschließend können Sie Ihrem öffentlichen SSH-Schlüssel (im Feld "Optionen" für SSH1) einen (eine Liste von) "erzwungenen Befehlen" hinzufügen, der auf dem Server installiert ist (in der Datei ~ / .ssh / authorized_keys für SSH1) , ~ / .ssh2 / Autorisierung für SSH2).
Machen Sie Ihren erzwungenen Befehl so, dass Ihre gewünschte Shell aufgerufen wird ...
Mehr: Sie können einem bestimmten Schlüssel höchstens einen erzwungenen Befehl zuordnen. Wenn Sie mehrere erzwungene Befehle für verschiedene Zwecke benötigen, müssen Sie verschiedene Schlüssel einrichten. (Natürlich können Sie mehrere Dinge in ein Skript einfügen, das Sie über einen erzwungenen Befehl aufrufen. Beachten Sie jedoch, dass erzwungene Befehle immer für ein bestimmtes Konto / einen bestimmten Schlüssel ausgeführt werden, wenn sich der Benutzer anmeldet, unabhängig davon, ob er nach einer anderen Ausführung gefragt hat. Wenn Sie den ursprünglich angeforderten Befehl dennoch einhalten möchten, lesen Sie, wie Sie die
$SSH_ORIGINAL_COMMAND
Variable ausnutzen können ...)Informieren Sie sich über "erzwungene Befehle" über Google .
quelle
/etc/sshrc
.Sie können die
-t
Option verwenden, um die Zuweisung einer Pseudotty für das zu startende Programm zu erzwingen, als ob Sie die Standard-Shell ausführen würden. Übergeben Sie dann die gewünschte Shell als einfaches altes Argument.Mit dieser Technik können Sie nicht nur jede installierte Shell verwenden, sondern auch vim und andere Programme, die eine TTY erfordern, mit einem einzigen Befehl öffnen. Was cool ist, wenn Sie ein Shell-Skript schreiben, das Sie irgendwo anmeldet und eine Datei auf vim oder htop oder so öffnet.
Ich bin mir nicht sicher, ob es sich um eine Login-Shell handelt, aber es gibt Optionen, mit denen Bash wie eine Login-Shell agiert.
quelle
Überraschenderweise sehe ich unterschiedliche Ergebnisse mit den folgenden:
im Strich laufen:
gegen Bash:
Das Anzeigen des Befehls in Anführungszeichen funktioniert wie erwartet.
quelle
sh -c "$*"
. So rennst dush -c "/bin/bash -c echo <(cat)"
; Derecho
Befehl selbst ist das einzige Argument, an das übergeben wird-c
, und das<(cat)
ist insgesamt ein separates Argument.Vor einiger Zeit war ich mit einer ähnlichen Situation konfrontiert, in der ich ksh coprocess für sqlplus verwenden musste, und ich hatte nur ein ssh, durch das gelesen und geschrieben werden muss.
Eine Möglichkeit, dies zu tun, besteht darin, alle abhängigen Befehle in eine Zeile (use;) nach / usr / bin / ksh auf dem Remote-Computer zu leiten. beispielsweise:
quelle