使用 Ctrl + C 取消程序时遇到一些困难。我相信我对频道的了解必须有点偏离,因为我无法理解为什么这个节目不会以 Ctrl + C 结束它会提示输入密码。
有人能够说出为什么在要求输入密码"之后它就会退出。并按 Ctrl + C ?
package main
import (
"fmt"
"os"
"os/user"
"os/signal"
"syscall"
"github.com/howeyc/gopass"
)
func main() {
signalChannel := make(chan os.Signal, 2)
signal.Notify(signalChannel, os.Interrupt, syscall.SIGINT)
go func() {
sig := <-signalChannel
switch sig {
case os.Interrupt:
os.Exit(0)
case syscall.SIGINT:
os.Exit(0)
}
}()
user, _ := user.Current()
fmt.Printf("Hi %s, password please: ", user.Username)
pass := gopass.GetPasswd()
fmt.Printf("Recieved as: %s\r\n", pass)
}
感谢任何帮助,谢谢。
更新
我通过切换到监听信号的https://github.com/seehuhn/password来解决这个问题
答案 0 :(得分:3)
Ctrl-C
是SIGINT。 Ctrl-\
是SIGQUIT(默认情况下)。您将需要更改应用程序侦听的信号。
这个答案进一步详细说明了终端中信号的典型(但有些实现可能会偏离)快捷方式:https://superuser.com/a/343046/93194
更新:gopass is interfering with your signal handling。请改用http://godoc.org/code.google.com/p/go.crypto/ssh/terminal#ReadPassword来代替:
state, err := terminal.MakeRaw(0)
if err != nil {
log.Fatal(err)
}
defer terminal.Restore(0, state)
term := terminal.NewTerminal(os.Stdout, ">")
password, err := term.ReadPassword("Enter password: ")
if err != nil {
log.Fatal(err)
}