Wie kann ich ausführen 2 oder mehr Befehle in der gleichen ssh-session?
Habe ich das folgende Skript:
#!/usr/bin/env ruby
require 'rubygems'
require 'net/ssh'
Net::SSH.start('host1', 'root', :password => "mypassword1") do |ssh|
stdout = ""
ssh.exec("cd /var/example/engines/")
ssh.exec!( "pwd" ) do |channel, stream, data|
stdout << data if stream == :stdout
end
puts stdout
ssh.loop
end
bekommen und habe /root
statt /var/example/engines/
- Ich habe eine kleine Frage zur ssh-ruby. Bitte helfen Sie mir - stackoverflow.com/questions/28799593/...
- Schade plain
Net::SSH
can ' T execute random scripts. Es scheint mir, dass es Essen neue Zeilen irgendwie und bash nicht funktionieren... die Verkettung der Zeilen mit;
funktioniert nicht, weil die Kommentare unbrauchbar macht alle Befehle, die nach Ihnen
Du musst angemeldet sein, um einen Kommentar abzugeben.
sehen, ob es etwas Analog zu der Datei(utils?) cd-block-syntax, ansonsten führen Sie einfach den Befehl in der gleichen subshell, z.B. ssh.exec "cd /var/Beispiel/Motoren/; pwd" ?
system
nennen, D. H. Sie nutzensysetm "cd /var/example/engines/ && pwd
Ausführung des
cd
Befehl, dann wird derpwd
Befehl in das neue Verzeichnis.Ich bin nicht ein ruby-guy, aber ich denke, es gibt wahrscheinlich elegantere Lösungen.
In Net::SSH,
#exec
&#exec!
sind die gleichen, z.B. wenn Sie einen Befehl ausführen (mit den Ausnahmen, dass exec! Blöcke, andere Anrufe, bis es fertig ist). Die wichtige Sache zu erinnern ist, dass Net::SSH läuft im wesentlichen jeden Befehl aus das Verzeichnis des Benutzers bei der Verwendung von exec/exec!. Also, in deinem code sind, laufen Siecd /some/path
von der/root
Verzeichnis und dannpwd
- wieder aus der/root
Verzeichnis.Der einfachste Weg, ich weiß, wie man mehrere Befehle in Folge auf die Kette zusammen mit der && (wie oben erwähnt durch andere Plakate). Also, es würde in etwa so Aussehen:
Leider Net::SSH shell-service entfernt wurde, in der version 2.
Können Sie einfach unterschiedliche Befehle, getrennt durch eine neue Zeile. So etwas wie:
Seine wahrscheinlich einfacher (und übersichtlicher) übergeben Sie den Befehl um eine variable, dann übergeben Sie die variable in
exec
. Dasselbe Prinzip, aber.Im nicht ein ruby-Programmierer, aber Sie könnten versuchen, verketten Sie Ihre Befehle mit ; oder &&
Früher gab es einen shell-service, die es erlauben stateful-Befehl, wie Ihr versucht zu tun, in net/ssh v1, aber es wurde zu entfernen, v2. Allerdings gibt es ein side-Projekt der Autor von net/ssh, der Ihnen erlaubt, das zu tun. Schau mal hier: http://github.com/jamis/net-ssh-shell
Den aktuellen Standort net-ssh-shell geändert wird.
Was ich mich entschieden habe, aber zu nennen eine zufällige shell-Skript zu scp eine Datei auf dem remote-Rechner und source-it-in-shell. Im Grunde, dies zu tun:
File.write(script_path, script_str)
gear.ssh.scp_to(script_path, File.dirname(script_path))
gear.ssh.exec(". script_path")