2016-11-18 3 views
1

Ich habe vor, eine golang Version SSH-Client zu implementieren, um Verbindung zum Zielserver von einer Bastion.But leider scheiterte ich an der Ersetzung für NC-Proxy.golang ssh Ersatz ssh ProxyCommand von nc

Bei meinem lokalen ssh config:

Host bastion 
    HostName xxx.xxx.xxx.xxx 
    User ec2-user 
    IdentityFile ~/.ssh/xxx-bastion.pem 
Host 10.0.*.* 
    User ec2-user 
    IdentityFile ~/.ssh/xxx-dest.pem 
    ProxyCommand ssh -q bastion "nc -w 3600 %h %p" 

meine golang Implementierung ist wie folgt aus:

var(
    Bastion="xxx.xxx.xxx.xxx:22" 
    Target="xxx.xxx.xxx.xxx:22" 
    BastionPem ="/Users/me/.ssh/xxx-bastion.pem" 
    DestPem ="/Users/me/.ssh/xxx-dest.pem" 
    Timeout=30*time.Second 
) 

func BastionConfig() (*ssh.ClientConfig,error){ 
    pemBytes, err := ioutil.ReadFile(BastionPem) 
    if err != nil { 
     log.Fatal(err) 
    } 
    signer, err := ssh.ParsePrivateKey(pemBytes) 
    if err != nil { 
     log.Fatalf("parse key failed:%v", err) 
    } 
    config := &ssh.ClientConfig{ 
     User: "ec2-user", 
     Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)}, 
     Timeout:Timeout, 
    } 
    return config,err 
} 


func DestConfig() (*ssh.ClientConfig,error){ 
    pemBytes, err := ioutil.ReadFile(TargetPem) 
    if err != nil { 
     log.Fatal(err) 
    } 
    signer, err := ssh.ParsePrivateKey(pemBytes) 
    if err != nil { 
     log.Fatalf("parse key failed:%v", err) 
    } 
    config := &ssh.ClientConfig{ 
     User: "ec2-user", 
     Auth: []ssh.AuthMethod{ssh.PublicKeys(signer)}, 
     Timeout:Timeout, 
    } 
    return config,err 
} 
func Connect(){ 
    config,_:= BastionConfig() 
    bClient, err := ssh.Dial("tcp", Bastion, config) 
    if err != nil { 
     log.Fatal("dial bastion error:",err) 
    } 
    log.Println("dial bastion ok...") 
    // Dial a connection to the service host, from the bastion 
    conn, err := bClient.Dial("tcp", Target) 
    if err != nil { 
     log.Fatal("dial target error",err) 
    } 
    targetConfig,_:= DestConfig() 
    ncc, chans, reqs, err := ssh.NewClientConn(conn, Target, targetConfig) 
    if err != nil { 
     log.Fatal("new target conn error:",err) 
    } 
    log.Printf("target conn[%s] ok\n",Target) 

    targetClient := ssh.NewClient(ncc, chans, reqs) 
    if err != nil { 
     log.Fatalf("target ssh error:%v",err) 
    } 

    session,err:=targetClient.NewSession() 

    if err!=nil{ 
     log.Fatalf("session failed:%v",err) 
    } 
    defer session.Close() 
    var stdoutBuf bytes.Buffer 
    session.Stdout = &stdoutBuf 
    err = session.Run("hostname") 
    if err != nil { 
     log.Fatalf("Run failed:%v", err) 
    } 
    log.Printf(">%s", stdoutBuf) 

} 

Aber ich habe die Hostnamen des Bastion Servers mein Ziel nicht ein, ich habe vermisse ich die Eingabe/Ausgabe des Zielservers zu führen oder sowas, ich weiß nicht wo mein Code falsch ist, Kann mir jemand ein paar Anweisungen geben.

vielen Dank.

Antwort

0

Ich habe meinen Code richtig gefunden. zuvor war ich lokal von der pem-datei verwirrt. In meiner Serverkonfiguration, dem Bastion- und dem Dest-Server, ist der Pem ziemlich anders. So ist der Code jetzt in Ordnung. Ich kann Befehle ausführen, indem ich mich mit golang ssh am Zielserver anmelde.

1

dieses Paket Versuchen https://github.com/appleboy/easyssh-proxy

ssh := &easyssh.MakeConfig{ 
    User: "drone-scp", 
    Server: "localhost", 
    Port: "22", 
    KeyPath: "./tests/.ssh/id_rsa", 
    Proxy: easyssh.DefaultConfig{ 
     User: "drone-scp", 
     Server: "localhost", 
     Port: "22", 
     KeyPath: "./tests/.ssh/id_rsa", 
    }, 
} 
Verwandte Themen