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)