usuario tiempo recuperar pide opciones net mas linea errores domain desde contraseña con completado como comandos comando clave cierto celular cambiar cada command-line haskell passwords terminal

command-line - tiempo - recuperar clave wifi android



Pedir una contraseña en la aplicación de línea de comandos de Haskell (5)

El siguiente programa de Haskell solicita al usuario una contraseña en el terminal y continúa si ingresó la correcta:

main = do putStrLn "Password:" password <- getLine case hash password `member` database of False -> putStrLn "Unauthorized use!" True -> do ...

Desafortunadamente, la contraseña aparecerá en la pantalla a medida que el usuario la escriba, lo que quiero evitar.

¿Cómo puedo leer una secuencia de caracteres que los usuarios escriben sin que aparezcan en la pantalla? ¿Cuál es el equivalente de getLine para este propósito?

Estoy en MacOS X, pero me gustaría que esto también funcione en Windows y Linux.


Como comenté anteriormente, le sugiero que use haskeline , que es una biblioteca de solicitud completa. Lo he usado felizmente para LambdaCalculator sin quejas.


Es posible desactivar el eco en el terminal con el módulo System.Posix.Terminal . Sin embargo, esto requiere soporte POSIX, por lo que es posible que no funcione en Windows (no lo verifiqué).

import System.Posix.Terminal import System.Posix.IO (stdInput) getPassword :: IO String getPassword = do tc <- getTerminalAttributes stdInput setTerminalAttributes stdInput (withoutMode tc EnableEcho) Immediately password <- getLine setTerminalAttributes stdInput tc Immediately return password main = do putStrLn "Password:" password <- getPassword putStrLn "Name:" name <- getLine putStrLn $ "Your password is " ++ password ++ " and your name is " ++ name

Tenga en cuenta que el stdin tiene búfer de línea, por lo que si usa putStr "Password:" lugar de putStrLn , primero debe vaciar el búfer, de lo contrario, el indicador también se inhibirá.


Hay un haskeline en System.Console.Haskeline . Probablemente sea una exageración para su caso, pero alguien puede encontrarlo útil.

Un ejemplo:

> runInputT defaultSettings $ do {p <- getPassword (Just ''*'') "pass:"; outputStrLn $ fromJust p} pass:*** asd


Intenta lo siguiente:

module Main where import System.IO import Control.Exception main :: IO () main = getPassword >>= putStrLn . ("Entered: " ++) getPassword :: IO String getPassword = do putStr "Password: " hFlush stdout pass <- withEcho False getLine putChar ''/n'' return pass withEcho :: Bool -> IO a -> IO a withEcho echo action = do old <- hGetEcho stdin bracket_ (hSetEcho stdin echo) (hSetEcho stdin old) action


withEcho se puede escribir con un poco menos de ruido:

withEcho :: Bool -> IO a -> IO a withEcho echo action = bracket (hGetEcho stdin) (hSetEcho stdin) (const $ hSetEcho stdin echo >> action)