Go 언어를 사용하여 원격 명령 실행 방법
원격으로 명령을 실행하면 무슨 소용이 있습니까?왜 원격으로 명령을 실행합니까?만약 당신이 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을 배우는 데 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.