我正在尝试通过tcp连接执行远程程序 我想在客户端<>服务器之间共享stdout和stdin。
我有以下测试服务器没有错误处理:p 我知道,目前我无法用参数执行程序, 但这很容易处理:)
package main
import (
"bufio"
"bytes"
"fmt"
"net"
"os/exec"
"strings"
)
func main() {
l, _ := net.Listen("tcp", ":420")
defer l.Close()
for {
// Wait for a connection.
conn, _ := l.Accept()
go func(c net.Conn) {
for {
msg, _ := bufio.NewReader(conn).ReadString('\n')
program := strings.Trim(msg, "\r\n")
cmd := exec.Command(program)
var b bytes.Buffer
cmd.Stdout = &b
//cmd.Stdin = &bi
cmd.Run()
c.Write([]byte(b.String() + "\n")) //not working
fmt.Println(b.String()) //working
}
//connection closed
c.Close()
}(conn)
}
}
你看,我尝试与c.Write()共享stdout,但这不起作用。
我认为cmd.Stdin的另一个问题与Stdout的问题相同。 此刻我没有实现任何Stdin函数。
有人可以给我这个功能的提示或示例代码吗?
答案 0 :(得分:0)
你可以尝试这个
package main
import (
"bufio"
"bytes"
"fmt"
"net"
"os/exec"
"strings"
)
func main() {
l, _ := net.Listen("tcp", ":8888")
defer l.Close()
for {
// Wait for a connection.
conn, _ := l.Accept()
go func(c net.Conn) {
for {
msg, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
break
}
program := strings.Trim(msg, "\r\n")
cmd := exec.Command(program)
var b bytes.Buffer
cmd.Stdout = &b
cmd.Run()
conn.Write(b.Bytes())
}
//connection closed
c.Close()
}(conn)
}
}
<强>客户端强>
package main
import (
"fmt"
"net"
)
func main() {
conn, _ := net.Dial("tcp", "127.0.0.1:8888")
for {
fmt.Print("Command to send: ")
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
conn.Write([]byte(fmt.Sprintf("%s\r\n", text)))
b := make([]byte, 512)
conn.Read(b)
fmt.Println(string(b))
}
}