我有一个示例程序在我的终端上接受密码,并且我使用终端软件包。但是,当我在输入密码时错误地按下任何箭头键时,我得到了一些奇怪的错误。
我想分开输入密码,然后只使用它进行授权。以下是我的尝试。
我的输入字符串是
// Accept password using terminal.ReadPassword() which returns []byte
// password entered is "\x1b[Aabcd"
// where \x1b[A is the up arrow key and abcd is my input entry.
for _, c := range bytes.Runes(password) {
if !unicode.IsPrint(c) {
fmt.Printf("\nINVALID PWD ")
} else {
d = append(d, c)
}
}
fmt.Println("\n\n", fmt.Sprintf("%c", d))
这里最后打印[Aabcd
。
无论如何我只能在没有[A这里?]的情况下捕获/打印输入字符?
由于
答案 0 :(得分:0)
1-如果您需要将控制序列与输入字符串分开,可以使用unicode.IsControl(r)
:
IsControl报告符文是否为控制角色。 C (其他)Unicode类别包括更多代码点,例如 代理人;使用Is(C,r)来测试它们。
2-另见:getpasswd functionality in Go?
package main
import "fmt"
import "github.com/howeyc/gopass"
func main() {
fmt.Printf("Password: ")
pass := gopass.GetPasswd()
// Do something with pass
}
您可以使用 3-而不是for _, c := range bytes.Runes(password) {
:for _, r := range password {
,如下代码:
d := make([]rune, 0, utf8.RuneCount([]byte(password)))
for _, r := range password {
if !unicode.IsControl(r) {
d = append(d, r)
}
}
fmt.Println(string(d))
4-您也可以将strings.Replace
用于VT100代码:
password = strings.Replace(password, "\x1b[A", "", -1)
请参阅:http://www.ccs.neu.edu/research/gpc/MSim/vona/terminal/VT100_Escape_Codes.html