nsenter
ctrl+R
nsenterstdin: is not a ttystdintty

感谢

package main 

import (
    "code.google.com/p/go.crypto/ssh" 
    "io/ioutil" 
    "log" 
    "os" 
) 

func privateKey() ssh.Signer { 
    buf, err := ioutil.ReadFile("./id_rsa") 
    if err != nil { 
    panic(err) 
    } 
    key, err := ssh.ParsePrivateKey(buf) 
    if err != nil { 
    panic(err) 
    } 

    return key 
} 

func main() { 
    privateKey := privateKey() 

    // Create client config 
    config := &ssh.ClientConfig{ 
    User: "core", 
    Auth: []ssh.AuthMethod{ 
     ssh.PublicKeys(privateKey), 
    }, 
    } 

    // Connect to ssh server 
    conn, err := ssh.Dial("tcp", "myhost.com:22", config) 
    if err != nil { 
    log.Fatalf("unable to connect: %s", err) 
    } 
    defer conn.Close() 

    // Create a session 
    session, err := conn.NewSession() 
    if err != nil { 
    log.Fatalf("unable to create session: %s", err) 
    } 

    session.Stdout = os.Stdout 
    session.Stderr = os.Stderr 
    session.Stdin = os.Stdin // How can session.Stdin be a tty? 

    ////////////////////////////////////////////////////////////////////// 
    // Stuff for interactive shell 
    // 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", 80, 40, modes); err != nil { 
    // log.Fatalf("request for pseudo terminal failed: %s", err) 
    //} 
    // Start remote shell 
    //if err := session.Shell(); err != nil { 
    // log.Fatalf("failed to start shell: %s", err) 
    //} 
    ////////////////////////////////////////////////////////////////////// 

    ////////////////////////////////////////////////////////////////////// 
    // Stuff for executing remote command 
    // 2202 in my example is actually the pid of a running container 
    if err := session.Run("sudo nsenter --target 2202 --mount --uts --ipc --net --pid"); err != nil { 
    panic("Failed to run: " + err.Error()) 
    } 
    ////////////////////////////////////////////////////////////////////// 

    session.Wait() 
} 

2014-10-11 xh3b4sd

+1

你'session.RequestPty'代码中的注释。你尝试过使用它吗?问题是'sudo'需要一个终端,所以它可以要求你的密码。如果你没有'-t'运行'ssh',你会遇到同样的问题。 – 2014-10-12 15:40:19

+0

谢谢你的提示。现在我可以直接从我的OSX盒子跳到容器中。正如我的问题所述,我仍然存在这个问题,例如不能使用'ctrl + R'反转搜索bash历史或使用'TAB'使用自动完成。尝试这个外壳会损坏。我的含糊猜测是,这与'TerminalModes'有关,但目前我不知道。任何其他想法呢? – 2014-10-12 15:49:14