Ich versuche, eine Remote-Datei über ssh Den folgenden Ansatz auf Shellgolang scp Datei mit Krypto/ssh
funktioniertssh hostname "tar cz /opt/local/folder" > folder.tar.gz
jedoch der gleiche Ansatz auf golang zum Download einiger Unterschiede in der Ausgabe Artefakt Größe zu geben. Zum Beispiel die gleichen Ordner mit reiner Shell produzieren Artefakt gz-Datei 179B und das gleiche mit go Skript 178B. Ich nehme an, dass etwas von io.Reader oder Sitzung wurde früher geschlossen wurde geschlossen. Bitte bittet euch, zu helfen.
Hier ist das Beispiel meines Skript:
func executeCmd(cmd, hostname string, config *ssh.ClientConfig, path string) error {
conn, _ := ssh.Dial("tcp", hostname+":22", config)
session, err := conn.NewSession()
if err != nil {
panic("Failed to create session: " + err.Error())
}
r, _ := session.StdoutPipe()
scanner := bufio.NewScanner(r)
go func() {
defer session.Close()
name := fmt.Sprintf("%s/backup_folder_%v.tar.gz", path, time.Now().Unix())
file, err := os.OpenFile(name, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
panic(err)
}
defer file.Close()
for scanner.Scan() {
fmt.Println(scanner.Bytes())
if err := scanner.Err(); err != nil {
fmt.Println(err)
}
if _, err = file.Write(scanner.Bytes()); err != nil {
log.Fatal(err)
}
}
}()
if err := session.Run(cmd); err != nil {
fmt.Println(err.Error())
panic("Failed to run: " + err.Error())
}
return nil
}
Dank!
Ein Scanner ist für Newline getrennte Text, tun Sie es nicht für binäre Daten (es entfernt die Zeilenumbrüche) – JimB
dank JimB, kann u pls raten, was für binäre Daten verwendet werden kann? – neveragny
Es ist auch sicherer, etwas Einzigartigeres als Sekunden zu verwenden, um einen eindeutigen Dateinamen wie 'ioutil.TempFile' oder zufällige Zeichenfolgen zu erzeugen, da 2 schnelle Ausführungen Ihres Programms oder gleichzeitige Ausführungen kollidieren können. – JimB