Golang Go语言中除了标准/错误输出,还有其他输出吗?为什么捕获 root 密码的输入不到?

发布于 1周前 作者 sinazl 来自 Go语言

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

5 回复

sudo -S 是从标准输入读密码的,可以试试 echo “xxx” | sudo -S …

更多关于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 才行

在Golang(Go语言)中,除了标准输出(stdout)和标准错误输出(stderr)之外,确实还有其他形式的输出,但这些通常不是直接用于打印文本到终端的“输出”,而是更广义上的数据输出,例如:

  1. 文件输出:通过os.File和相关的I/O操作,可以将数据写入到文件中。
  2. 网络输出:使用net包,可以实现网络数据的发送,如HTTP响应、TCP/UDP消息等。
  3. 日志输出:借助第三方库(如logruszap等),可以将日志信息输出到不同的目的地,包括文件、控制台、远程服务器等。

关于捕获root密码输入不到的问题,这通常与终端输入的处理方式有关,而不是Go语言本身的限制。在Unix/Linux系统中,出于安全考虑,当输入密码时,终端通常会设置为不显示输入字符(即使用termios库的ECHO标志关闭回显)。因此,即使你在Go程序中尝试读取密码输入,也不会在屏幕上看到任何字符。

为了捕获密码输入,你可以使用Go的termboxgolang.org/x/crypto/ssh/terminal包来读取输入而不回显到终端。同时,请注意处理密码时的安全性,避免在内存中长时间存储或以不安全的方式传输密码。

综上所述,Go语言的输出形式多样,而密码输入问题则与终端处理和安全设置相关。

回到顶部