it-swarm.com.de

Wie können Sie mit ssh einen Befehl auf dem Remote-Computer ausführen, ohne ihn zu beenden?

Normalerweise, wenn Sie einen Befehl an ssh wie folgt übergeben

ssh [email protected] 'some-command.sh'

Sie erhalten eine nicht interaktive Sitzung und ssh wird beendet, sobald der Befehl (oder das Skript oder was auch immer) ausgeführt wird. Wie kann ich eine interaktive Sitzung abrufen und dennoch einen Befehl ausführen, den ich auf meinem lokalen Computer angegeben habe? Zum Beispiel möchte ich in der Lage sein, einen Bildschirm zu öffnen und eine bestimmte Bildschirmsitzung neu zu starten:

ssh [email protected] 'screen -r 12345'

dies ist jedoch nicht zulässig und gibt den Fehler "Muss mit einem Terminal verbunden sein" zurück. was ich vermute bedeutet im Wesentlichen "muss diesen Befehl von einer interaktiven Shell aufrufen".

Als weiteres Beispiel benutze ich eine Menge Maschinen bei der Arbeit, die oft erfordern, dass ich ein gemeinsames Konto benutze, um Rechte für bestimmte Dinge zu haben (ja, ich weiß: schlechte Idee, aber beschuldige mich nicht, das habe ich nicht eingerichtet Art und Weise), und sie haben in der Regel ksh als Standard-Shell. Ich möchte mich anmelden, zu bash (oder zsh) wechseln und das .bash_profile (oder .zshrc) meines eigenen Kontos beziehen. Dies wäre einfach, wenn ich eine interaktive SSH-Sitzung einrichten und einen Befehl an den Remote-Computer übergeben könnte, der bei der Anmeldung ausgeführt wird.

Ich habe eine sehr kludgey (und ungetestete) Lösung im Sinn, die ich posten werde, aber ich hoffe, dass jemand einen besseren Weg kennt.

UPDATE: Für diejenigen, die dies nicht bemerkt haben, habe ich nicht vor, dies alles von Hand zu tun. Wenn ich also auffordere, eine interaktive Sitzung zu eröffnen und es dann von Hand zu tun, löst das eigentlich nichts.

2. UPDATE: Um es noch einmal zu klären: Ich versuche (beliebige) Befehle auf dem Server auszuführen (programmgesteuert auf dem Client angegeben), aber dann ist eine interaktive Sitzung geöffnet, die von allen Aktionen dieser programmgesteuerten Befehle betroffen ist.

28
iconoclast

Das ist klug und ungetestet, aber ich denke, es sollte funktionieren.

Erstellen Sie ein Skript mit dem Namen (z. B.) remote-starter, das nach einem user @ Host-Argument ein Argument in Anführungszeichen setzt:

remote-starter [email protected] 'some-command.sh arg1 arg2'

Dieses Skript sollte zuerst den Befehl in Anführungszeichen (ohne Anführungszeichen) in der Datei mit dem Namen (z. B.) .onetime auf dem Remotecomputer speichern und dann einen regulären Befehl ssh ausführen, wobei dieses Mal kein Befehl übergeben wird, der auf dem Remotecomputer ausgeführt werden soll. (Wenn Sie ssh [email protected] in einem Skript ausführen, funktioniert es möglicherweise, exec ssh [email protected] auszuführen.)

Damit dies funktioniert, muss der Remotecomputer .onetime aus seinem .bash_profile oder .zshrc oder was auch immer beziehen. Nach dem Ausführen von .onetime sollte .onetime gelöscht werden, damit die Datei beim nächsten normalen Anmelden nicht ausgeführt wird.

0
iconoclast

Sie können den folgenden Befehl verwenden, um bash zu starten und Ihr eigenes Profil zu erstellen, wenn Sie ssh ausführen:

ssh  -t hostname "bash --rcfile ~user/.bashrc"
24
dogbane

Aufbauend auf der Antwort von dogbane sieht eine vollständige Lösung folgendermaßen aus:

ssh -t [email protected] 'cd /a/great/place; bash'

Hier verwende ich -t, um die Zuweisung eines Pseudoterminals zu erzwingen, das für eine interaktive Shell erforderlich ist. Dann führe ich zwei Befehle auf dem Server aus: Zuerst das, was ich vor dem Öffnen der interaktiven Shell tun wollte (in meinem Fall, indem ich das Verzeichnis in einen bestimmten Ordner ändere), und dann die interaktive Shell selbst. bash erkennt, dass es ein Pseudo-Terminal hat und reagiert interaktiv.

Die einzelnen Anführungszeichen stellen sicher, dass das Ganze als Befehl, der von Ihrer Standard-Shell ausgeführt wird, an den Remote-Server übergeben wird.

Nochmals vielen Dank an dogbane, dass sie den nötigen Hinweis mit -t gegeben haben. Ich habe dieses Problem mit expect gelöst, was definitiv bedeutet, eine Maus mit einer Kanone zu töten. (:

11
user1179239

Versuchen Sie diese Lösung.

echo "command" | ssh [email protected]_Host

Die Anmeldung ist interaktiv und Ihr Befehl wird so übergeben, als ob Sie ihn in der interaktiven Befehlszeile eingegeben hätten. Die Sitzung wird beendet, als hätten Sie etwas eingegeben

ssh [email protected]_Host 'command'
2
user210540

warum nicht installieren auf dem Remote-System trennen und verwenden:

ssh -t [email protected] "/home/user/bin/detach ls"
0
Dan D.

die Antwort von laggingreflex ist nah ... Ich würde es wie folgt ändern:

echo "command\n$(cat -)" | ssh [email protected]_Host

Leider wird es Ihnen nicht gefallen, weil "cat" die Zeilen puffert, die es in stdout schreibt ... Wenn wir ein Skript namens "echo-cat" erstellen, das ungefähr so ​​aussieht:

{
  echo "${@}"
 #cat buffers & won't flush to stdout immediately
 #cat -
  IFS='\n'
  while read line
  do
        echo "${line}"
  done
}

wir erhalten das gleiche Ergebnis ohne Pufferung:

echo-cat "command" | ssh [email protected]_Host

Damit kommen Sie Ihrem Ziel wahrscheinlich viel näher ...

0
Bill

Verwenden Sie ssh -X, um termIO cmds zu verwenden.

Außerdem können Sie Ihre Befehle wie "ssh 'source ~/.bashrc && cd && do'" verketten.

0
ethrbunny