两次写入同一个子进程golang
writing twice to the same sub process golang
我有一个简单的 scp
函数,它只是 scp
cli 工具的包装器。
type credential struct {
username string
password string
host string
port string
}
func scpFile(filepath, destpath string, c *credential) error {
cmd := exec.Command("scp", filepath, c.username+"@"+c.host+":"+destpath)
if err := cmd.Run(); err != nil {
return err
}
fmt.Println("done")
return nil
}
这现在工作得很好我想添加在 scp 需要时输入 SSH 密码的功能。这是我想出的
func scpFile(filepath, destpath string, c *credential) error {
cmd := exec.Command("scp", filepath, c.username+"@"+c.host+":"+destpath)
stdin, err := cmd.StdinPipe()
if err != nil {
return err
}
defer stdin.Close()
if err := cmd.Start(); err != nil {
return err
}
io.WriteString(stdin, c.password+"\n")
cmd.Wait()
fmt.Println("done")
return nil
}
这不起作用,因为密码提示只是挂在那里。在我重新写入 stdin
之前,我尝试添加 1 秒的睡眠时间,我想也许我正在快速写入密码,但没有产生任何影响。
所以我能够找到解决方法,而不是尝试将密码发送到 stdin
我创建了一个 ssh 会话并通过 ssh 会话 scp
一个文件。这是新的 scpFile
函数:
func scpFile(filePath, destinationPath string, session *ssh.Session) error {
defer session.Close()
f, err := os.Open(filePath)
if err != nil {
return err
}
defer f.Close()
s, err := f.Stat()
if err != nil {
return err
}
go func() {
w, _ := session.StdinPipe()
defer w.Close()
fmt.Fprintf(w, "C%#o %d %s\n", s.Mode().Perm(), s.Size(), path.Base(filePath))
io.Copy(w, f)
fmt.Fprint(w, "\x00")
}()
cmd := fmt.Sprintf("scp -t %s", destinationPath)
if err := session.Run(cmd); err != nil {
return err
}
return nil
}
这可能会做得更好,但主要思想就在那里
我有一个简单的 scp
函数,它只是 scp
cli 工具的包装器。
type credential struct {
username string
password string
host string
port string
}
func scpFile(filepath, destpath string, c *credential) error {
cmd := exec.Command("scp", filepath, c.username+"@"+c.host+":"+destpath)
if err := cmd.Run(); err != nil {
return err
}
fmt.Println("done")
return nil
}
这现在工作得很好我想添加在 scp 需要时输入 SSH 密码的功能。这是我想出的
func scpFile(filepath, destpath string, c *credential) error {
cmd := exec.Command("scp", filepath, c.username+"@"+c.host+":"+destpath)
stdin, err := cmd.StdinPipe()
if err != nil {
return err
}
defer stdin.Close()
if err := cmd.Start(); err != nil {
return err
}
io.WriteString(stdin, c.password+"\n")
cmd.Wait()
fmt.Println("done")
return nil
}
这不起作用,因为密码提示只是挂在那里。在我重新写入 stdin
之前,我尝试添加 1 秒的睡眠时间,我想也许我正在快速写入密码,但没有产生任何影响。
所以我能够找到解决方法,而不是尝试将密码发送到 stdin
我创建了一个 ssh 会话并通过 ssh 会话 scp
一个文件。这是新的 scpFile
函数:
func scpFile(filePath, destinationPath string, session *ssh.Session) error {
defer session.Close()
f, err := os.Open(filePath)
if err != nil {
return err
}
defer f.Close()
s, err := f.Stat()
if err != nil {
return err
}
go func() {
w, _ := session.StdinPipe()
defer w.Close()
fmt.Fprintf(w, "C%#o %d %s\n", s.Mode().Perm(), s.Size(), path.Base(filePath))
io.Copy(w, f)
fmt.Fprint(w, "\x00")
}()
cmd := fmt.Sprintf("scp -t %s", destinationPath)
if err := session.Run(cmd); err != nil {
return err
}
return nil
}
这可能会做得更好,但主要思想就在那里