Go 中的 getpasswd 功能?
情况:
我想从 stdin
控制台获取密码输入 - 不回显用户输入的内容。 Go 中有类似 getpasswd 功能的东西吗?
我尝试过的:
我尝试使用syscall.Read
,但它会回显键入的内容。
Situation:
I want to get a password entry from the stdin
console - without echoing what the user types. Is there something comparable to getpasswd
functionality in Go?
What I tried:
I tried using syscall.Read
, but it echoes what is typed.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
以下是完成此任务的最佳方法之一。
首先通过
go get golang.org/x/term
获取term
包http://play.golang.org/p/l-9IP1mrhA
The following is one of best ways to get it done.
First get
term
package bygo get golang.org/x/term
http://play.golang.org/p/l-9IP1mrhA
刚刚在#go-nuts 邮件列表中看到一封邮件。有人写了一个相当简单的 go 包来使用。你可以在这里找到它: https://github.com/howeyc/gopass
类似这样的:
Just saw a mail in #go-nuts maillist. There is someone who wrote quite a simple go package to be used. You can find it here: https://github.com/howeyc/gopass
It something like that:
自 Go ~v1.11 起,有一个官方软件包
golang.org/x/term
取代了已弃用的crypto/ssh/terminal
。除其他外,它还具有函数term.ReadPassword< /代码>
。
用法示例:
Since Go ~v1.11 there is an official package
golang.org/x/term
which replaces the deprecatedcrypto/ssh/terminal
. It has, among other things, the functionterm.ReadPassword
.Example usage:
我有一个类似的用例,下面的代码片段对我来说效果很好。如果您仍然被困在这里,请随意尝试一下。
当然,你需要事先使用
go get
安装终端包。I had a similar usecase and the following code snippet works well for me. Feel free to try this if you are still stuck here.
Of course, you need to install terminal package using
go get
beforehand.您可以通过执行
stty -echo
关闭回显,然后在读取密码后执行stty echo
将其重新打开you can do this by execing
stty -echo
to turn off echo and thenstty echo
after reading in the password to turn it back on这是我使用 Go1.6.2 开发的一个解决方案,您可能会觉得有用。
它仅使用以下标准包:
bufio
、fmt
、os
、strings
和syscall.更具体地说,它使用 syscall.ForkExec() 和 syscall.Wait4() 来调用 stty 来禁用/启用终端回显。
我已经在 Linux 和 BSD (Mac) 上进行了测试。它不适用于 Windows。
Here is a solution that I developed using Go1.6.2 that you might find useful.
It only uses the following standard packages:
bufio
,fmt
,os
,strings
andsyscall
. More specifically, it usessyscall.ForkExec()
andsyscall.Wait4()
to invoke stty to disable/enable terminal echo.I have tested it on Linux and BSD (Mac). It will not work on windows.
需要通过 Go ForkExec() 函数启动 stty:
Required launching stty via Go ForkExec() function:
这是特定于 Linux 的版本:
因此使用它:
它是 Linux 特定的 TCGETS 系统调用。 OSX 和 Windows 有不同的系统调用值。
Here is a version specific to Linux:
So to use it:
It's the TCGETS syscall that is linux specific. There are different syscall values for OSX and Windows.
您还可以使用 https://github.com/peterh/linerPasswordPrompt 功能a> 包。
You could also use
PasswordPrompt
function of https://github.com/peterh/liner package.如果没有第三个库,您可以找到在 UNIX 上使用它的方法,如上所示。但在 Windows 上就很难了。
您可以通过使用 Windows
kernel32.dll
的方法SetConsoleMode
来实现它,参考 C: 如何在 Windows 控制台中禁用回显?Without third library, you can find ways to do with it on unix shown above. But it's difficult on Windows.
You can achieve it by method
SetConsoleMode
with windowskernel32.dll
referring to the accepted answer from C: How to disable echo in windows console?您可以使用 os.File 对象(或 os.Stdin 变量)的 Read 方法获得所需的行为。以下示例程序将读取一行文本(通过按返回键终止),但在调用 fmt.Printf 之前不会回显它。
如果您想要更高级的行为,您可能必须使用 Go C 包装实用程序并为低级 api 调用创建一些包装器。
You can get the behavior you want with the Read method from the os.File object (or the os.Stdin variable). The following sample program will read a line of text (terminated with by pressing the return key) but won't echo it until the fmt.Printf call.
If you want more advanced behavior, you're probably going to have to use the Go C-wrapper utilities and create some wrappers for low-level api calls.