Go 언어를 사용하여 원격 명령 실행 방법

4030 단어
앞말
원격으로 명령을 실행하면 무슨 소용이 있습니까?왜 원격으로 명령을 실행합니까?만약 당신이 2, 3대의 서버만 관리해야 할 때 원격 실행 명령은 확실히 큰 작용이 없다. 당신은 모든 서버에 로그인하여 각종 조작을 완성할 수 있다.서버가 3대보다 크면 원격으로 실행하는 명령의 방식은 당신의 생산력을 크게 높일 수 있습니다.
만약 당신이 원격으로 명령을 집행할 수 있는 도구가 있다면, 한 대의 기계를 조작하는 것처럼 여러 대의 기계를 조작할 수 있고, 기계가 많을수록, 효율이 높아질 것이다.원격 실행 명령의 가장 일반적인 방법은 SSH 프로토콜을 이용하여 명령을 원격 기계에 보내서 실행하고 결과를 되돌려 받는 것이다.
일반 명령
일반 명령이란 일정 시간 내에 실행되는 명령이다.예를 들어grep,cat 등등.명령을 실행하려면 연결, 실행, 결과 얻기
연결
연결에는 인증이 포함되어 있습니다. 패스워드나 sshkey 두 가지 방식으로 인증할 수 있습니다.다음 예는 간단하기 위해 암호 인증 방식을 사용하여 연결을 완성했다.

import ( 
 "fmt"
 "time"

 "golang.org/x/crypto/ssh"
)

func connect(user, password, host string, port int) (*ssh.Session, error) { 
 var (
 auth  []ssh.AuthMethod
 addr  string
 clientConfig *ssh.ClientConfig
 client *ssh.Client
 session *ssh.Session
 err  error
 )
 // get auth method
 auth = make([]ssh.AuthMethod, 0)
 auth = append(auth, ssh.Password(password))

 clientConfig = &ssh.ClientConfig{
 User: user,
 Auth: auth,
 Timeout: 30 * time.Second,
 }

 // connet to ssh
 addr = fmt.Sprintf("%s:%d", host, port)

 if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
 return nil, err
 }

 // create session
 if session, err = client.NewSession(); err != nil {
 return nil, err
 }

 return session, nil
}

호스트에 로그인한 사용자 *, * 암호 *, * 호스트 이름 또는 IP *, * SSH 포트만 있으면 쉽게 연결할 수 있습니다.
실행, 명령 결과 가져오기
연결에 성공하면 명령을 실행하는 것이 간단합니다

import ( 
 "fmt"
 "log"
 "os"
 "time"

 "golang.org/x/crypto/ssh"
)

func main() { 
 session, err := connect("root", "xxxxx", "127.0.0.1", 22)
 if err != nil {
 log.Fatal(err)
 }
 defer session.Close()

 session.Run("ls /; ls /abc")
}

위의 코드가 실행된 후에 명령은 정상적으로 실행되었지만 정상적인 출력 결과도 없고 이상한 출력 결과도 없습니다.결과를 표시하려면 session의 Stdout와 Stderrr를 다음과 같이 수정해야 합니다.

func main() { 
 session, err := connect("root", "xxxxx", "127.0.0.1", 22)
 if err != nil {
 log.Fatal(err)
 }
 defer session.Close()

 session.Stdout = os.Stdout
 session.Stderr = os.Stderr
 session.Run("ls /; ls /abc")
}

이렇게 하면 화면에 정상적이고 이상한 정보를 표시할 수 있다.
대화식 명령
위의 방식은 상호작용 명령을 원격으로 실행할 수 없습니다. 예를 들어 top, 원격으로 파일을 편집할 수 있습니다. 예를 들어vi /etc/nginx/nginx.conf 상호작용 명령을 지원하려면 현재 terminal이 원격 PTY를 인수해야 합니다.

func main() { 
 session, err := connect("root", "olordjesus", "dockers.iotalabs.io", 2210)
 if err != nil {
 log.Fatal(err)
 }
 defer session.Close()

 fd := int(os.Stdin.Fd())
 oldState, err := terminal.MakeRaw(fd)
 if err != nil {
 panic(err)
 }
 defer terminal.Restore(fd, oldState)

 // excute command
 session.Stdout = os.Stdout
 session.Stderr = os.Stderr
 session.Stdin = os.Stdin

 termWidth, termHeight, err := terminal.GetSize(fd)
 if err != nil {
 panic(err)
 }

 // Set up terminal modes
 modes := ssh.TerminalModes{
 ssh.ECHO:  1, // enable echoing
 ssh.TTY_OP_ISPEED: 14400, // input speed = 14.4kbaud
 ssh.TTY_OP_OSPEED: 14400, // output speed = 14.4kbaud
 }

 // Request pseudo terminal
 if err := session.RequestPty("xterm-256color", termHeight, termWidth, modes); err != nil {
 log.Fatal(err)
 }

 session.Run("top")
}

총결산
자, 이렇게 하면 상호작용 명령을 실행할 수 있습니다. 예를 들어 위의 top도vi/etc/nginx/nignx를 통해 실행할 수 있습니다.conf 같은 명령으로 파일을 원격으로 편집합니다.이상은 Go 언어를 사용하여 원격 명령을 실행하는 모든 내용입니다. 본고는python을 배우는 데 도움이 되기를 바랍니다.

좋은 웹페이지 즐겨찾기