【发布时间】:2016-11-09 14:27:38
【问题描述】:
我正在尝试通过 ssh 下载远程文件 以下方法在 shell 上运行良好
ssh hostname "tar cz /opt/local/folder" > folder.tar.gz
但是,在 golang 上使用相同的方法会在输出工件大小上产生一些差异。例如,具有纯 shell 的相同文件夹会生成工件 gz 文件 179B,并且与 go 脚本 178B 相同。 我假设 io.Reader 中遗漏了某些内容,或者会话提前关闭。请大家帮忙。
这是我的脚本示例:
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
}
谢谢!
【问题讨论】:
-
扫描仪用于换行符分隔的文本,不要将其用于二进制数据(它会删除换行符)
-
谢谢 JimB,你能告诉我什么可以用于二进制数据吗?
-
此外,使用比秒更独特的东西来创建唯一文件名(如
ioutil.TempFile或随机字符串)也更安全,因为您的程序的 2 次快速运行或同时执行可能会发生冲突。