2016-11-18 5 views
1

ich mehrere Befehle in einem einzigen SSH-Sitzung ausgeführt werden müssen:Ausführen mehrerer Befehle in einer SSH-Sitzung

// Define the client configuration 
config := &ssh.ClientConfig{ 
    User: USERNAME, 
    Auth: []ssh.AuthMethod{ 
     ssh.PublicKeys(pem), 
    }, 
} 

// Connect to the machine 
client, err := ssh.Dial("tcp", HOSTNAME + ":" + PORT, config) 
if err != nil { 
    panic("Failed to dial: " + err.Error()) 
} 

// Create a session 
session, err := client.NewSession() 
if err != nil { 
    panic("Failed to create session: " + err.Error()) 
} 
defer session.Close() 

// Start running commands! 
var output bytes.Buffer 
session.Stdout = &output 

// 1) Login to swarm registry 
fmt.Println("Logging into swarm registry...") 
if err := session.Run("docker login ..."); err != nil { 
    panic("Failed to login to swarm registry: " + err.Error()) 
} 
fmt.Println(output.String()) 

// 2) List all of the docker processes 
fmt.Println("List swarm processes...") 
if err := session.Run("docker ps"); err != nil { // <-------- FAILS HERE 
    panic("Failed to list swarm processes: " + err.Error()) 
} 
fmt.Println(output.String()) 

Ich las über die Quelldatei (session.go) und für den Session.Run Befehl, und es sagt:

Eine Sitzung akzeptiert nur einen Aufruf von Run, Start, Shell, Output oder CombinedOutput.

Für meinen Anwendungsfall muss ich den ersten Befehl erteilen die Sitzung in, um sich einzuloggen und dann nachfolgende Befehle ausgeben, wenn ich angemeldet bin.

Gibt es eine alternative Möglichkeit, mehrere Befehle mit dem gleichen laufen SSH-Sitzung?

+0

haben Sie Bildschirm http versucht: //www.tecmint. com/screen-command-examples-to-manage-linux-terminals/ – Xenwar

+0

Die einzige Möglichkeit, mehrere Befehle in einer einzigen Sitzung auszuführen, besteht darin, sie zusammen in einem Shell-Skript oder interaktiv auszuführen, indem die Shell-Ausgabe analysiert und in die Eingabe geschrieben wird . Dies ist das gleiche wie wenn Sie ssh in der Befehlszeile verwenden würden. – JimB

+0

@Tyler: interaktiv mit der Remote-Shell ist nicht wirklich ratsam, es ist eher eine letzte Möglichkeit, und man verwendet in der Regel etwas wie "erwarten" dafür. Wie für das Senden einer Reihe von Befehlen in einem Skript, welches Beispiel benötigen Sie? Sie haben es bereits implementiert, senden Sie einfach den Text, der von der Remote-Shell interpretiert werden soll (erinnern Sie sich, ssh ist nur eine entfernte "sichere Shell", kein allgemeines RPC-System) – JimB

Antwort

1

Dank @JimB ich jetzt tue dies statt:

// Create a single command that is semicolon seperated 
commands := []string{ 
    "docker login", 
    "docker ps", 
} 
command := strings.Join(commands, "; ") 

Und dann ist es das gleiche läuft nach wie vor:

if err := session.Run(command); err != nil { 
    panic("Failed to run command: " + command + "\nBecause: " + err.Error()) 
} 
fmt.Println(output.String()) 
Verwandte Themen