Golang Go语言中除了标准/错误输出,还有其他输出吗?为什么捕获 root 密码的输入不到?
Go 代码:
func A() {
c := exec.Command("bash")
var i = bytes.NewBuffer(nil)
var o = bytes.NewBuffer(nil)
c.Stdin = i
c.Stdout = o
c.Stderr = o
if err := c.Start(); err != nil {
panic(err.Error())
}
i.Write([]byte("sudo echo abc"))
i.Write([]byte("1")) // root password
if err := c.Wait(); err != nil {
panic(err.Error())
}
fmt.Println("标准 /错误输出:", o.String())
}
Golang Go语言中除了标准/错误输出,还有其他输出吗?为什么捕获 root 密码的输入不到?
更多关于Golang Go语言中除了标准/错误输出,还有其他输出吗?为什么捕获 root 密码的输入不到?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
好像终端密码输入有些特别
具体可以参考 pexpect 实现
python 写的比较容易看
https://stackoverflow.com/questions/55351259/how-does-ssh-receive-password-from-tty
For security reasons, many programs requires a password interactively from users. Quite many programs uses the following kind of check before reading a password from stdin:
if (isatty(STDIN_FILENO) == 0)
{
exit(EXIT_FAILURE);
}
也就是说你要欺骗 ssh 进程让它认为 stdin 是 tty 才行
直接读 tty
在Golang(Go语言)中,除了标准输出(stdout)和标准错误输出(stderr)之外,确实还有其他形式的输出,但这些通常不是直接用于打印文本到终端的“输出”,而是更广义上的数据输出,例如:
- 文件输出:通过
os.File
和相关的I/O操作,可以将数据写入到文件中。 - 网络输出:使用
net
包,可以实现网络数据的发送,如HTTP响应、TCP/UDP消息等。 - 日志输出:借助第三方库(如
logrus
、zap
等),可以将日志信息输出到不同的目的地,包括文件、控制台、远程服务器等。
关于捕获root密码输入不到的问题,这通常与终端输入的处理方式有关,而不是Go语言本身的限制。在Unix/Linux系统中,出于安全考虑,当输入密码时,终端通常会设置为不显示输入字符(即使用termios
库的ECHO
标志关闭回显)。因此,即使你在Go程序中尝试读取密码输入,也不会在屏幕上看到任何字符。
为了捕获密码输入,你可以使用Go的termbox
或golang.org/x/crypto/ssh/terminal
包来读取输入而不回显到终端。同时,请注意处理密码时的安全性,避免在内存中长时间存储或以不安全的方式传输密码。
综上所述,Go语言的输出形式多样,而密码输入问题则与终端处理和安全设置相关。