2016-08-26 2 views
0

Ich habe ein Beispielprogramm, um Passwörter auf meinem Terminal zu akzeptieren, und ich verwende das Terminal-Paket dafür. Wenn ich jedoch versehentlich eine der Pfeiltasten während der Eingabe meines Passworts drücke, erhalte ich seltsame Fehler.Wie kann ich die Steuersequenz von der Eingabezeichenfolge trennen?

Ich wollte mein Eingabe-Passwort trennen und dann nur für die Autorisierung verwenden. Folgendes habe ich versucht.

Meine Eingabezeichenfolge ist

// 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)) 

Hier druckt [Aabcd am Ende.

Kann ich die Eingabezeichen nur ohne die [A hier?

Dank

Antwort

0

1- Wenn Sie die Steuersequenz von Eingabezeichenfolge trennen müssen, können Sie unicode.IsControl(r) verwenden:

IsControl meldet, ob die Rune ein Steuerzeichen ist. Die Unicode-Kategorie C (Other) enthält mehr Codepunkte wie Surrogate; Verwenden Sie Is (C, r), um nach ihnen zu suchen.

2- Siehe auch: 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- statt for _, c := range bytes.Runes(password) { Sie verwenden: for _, r := range password {, wie dem folgenden Code:

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- Auch Sie können strings.Replace verwenden für VT100-Codes:

password = strings.Replace(password, "\x1b[A", "", -1) 

Und siehe: http://www.ccs.neu.edu/research/gpc/MSim/vona/terminal/VT100_Escape_Codes.html

Verwandte Themen