2016-11-07 11 views
0

scp cli 도구에 대한 단순한 래퍼 인 간단한 scp 함수가 있습니다.동일한 하위 프로세스에 두 번 쓰기 golang

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 
} 

비밀번호 프롬프트가 멈추기 때문에 작동하지 않습니다. 나는에 글을 쓰려고하기 전에 1 초의 수면을 추가하려고 시도했다. 어쩌면 내가 빨리 암호를 쓰려고했지만 어리석은 짓을하지 않았다.

+1

있다가, 그것은 [단지 일반적으로 암호를 읽지 않습니다 ] (http://stackoverflow.com/questions/1340366/how-to-make-ssh-receive-the-password-from-stdin). 다양한 보안 고려 사항이 있으므로 세부 사항을 확인하십시오. – nothingmuch

+0

'scp'는 단지'ssh'를 전송 수단으로 사용하는 유틸리티입니다. ssh와 같은 방식으로 자동화하십시오. 공개 키 인증을 사용하는 것이 더 바람직합니다. – JimB

답변

0

암호를 보내려고하는 대신에 작업을 찾을 수있었습니다. stdin ssh 세션을 만들고 scp 파일을 ssh 세션을 통해 만듭니다. 여기에 새로운 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 프로그램의 특성이다