我当前正在编写一个具有参数的应用程序,它将在远程服务器上运行命令。我正在使用/ x / crypto / ssh软件包,如果我使用诸如“ who”或“ ls”之类的衬里命令,那么一切似乎都进行得很顺利,但是,如果我运行更复杂的命令,例如:
“ grep SOMEDATA /var/log/logfile.log”
程序立即退出,命令执行行只剩下“进程退出,状态为1”,我什么也没回来。
如果我查看用户的历史记录,就知道它是通过SSH远程系统登录的,则根本看不到命令在运行。
之前有没有其他人遇到过此类问题?这是我用来执行此操作的代码片段(当然,敏感数据已删除):
func returnData(w http.ResponseWriter, r *http.Request) {
var b bytes.Buffer
hostKey, err := getHostKey("SERVERNAME")
if err != nil {
log.Fatalln(err)
}
err = r.ParseForm()
if err != nil {
log.Fatalln(err)
}
config := &ssh.ClientConfig{
User: "USERNAME",
Auth: []ssh.AuthMethod{
ssh.Password("TESTPASS"),
},
HostKeyCallback: ssh.FixedHostKey(hostKey),
}
client, err := ssh.Dial("tcp", "SERVERNAME:22", config)
if err != nil {
log.Fatalln("Creating Client Failed: ", err)
}
session, err := client.NewSession()
if err != nil {
log.Fatalln("Creating new Session Failed: ", err)
}
session.Stdout = &b
inputData := r.Form["fname"][0]
cmdExecute := fmt.Sprintf(`sudo grep %v /var/log/logfile.log`, inputData)
log.Println(cmdExecute)
if err := session.Run(cmdExecute); err != nil {
log.Fatalln("Getting Data From session Failed: ", err)
log.Fatalln(b.String())
}
//log.Println(hostKey)
defer session.Close()