2016-04-02 25 views
0

ユーザーをシステムに自動的に追加してsambaに追加するためのHaskellプログラムを作成していますが、パスワードを尋ねています。私は​​と一緒にこのような目標を達成するために使用できるパラメータは見つかりませんでした。私に何ができる?ここで パスワードが必要な場合、Haskell - System.Processでエラーが発生する

は私のコードです:

import System.Environment(getArgs) 
import System.Process (createProcess, shell) 

main = do 
    (user:pass:_) <- getArgs 
    putStrLn $ "Creating user " ++ user ++ " " ++ pass ++ "..." 
    callCommand $ "useradd " ++ user 
    callCommand $ "echo \"" ++ user ++ "\":\"" ++ pass ++ "\" | chpasswd" 
    putStrLn $ "User Created. Adding it to samba..." 
    callCommand $ "smbpasswd -a " ++ user 

callCommand = createProcess . shell 

結果:

-bash# runghc test.hs testUser 12345 
Creating user testUser 12345... 
User Created. Adding it to samba... 
chpasswd: (user testUser) pam_chauthtok() failed, error: 
Authentication token manipulation error 
chpasswd: (line 1, user testUser) password not changed 
-bash# New SMB password: 
Retype new SMB password: 
Failed to add entry for user testUser. 

私はpass引数は​​プログラム(またはを押して、自動的に入力します)に利用者から受け取ったパス、およびこのエラーを回避することはできますか?

+0

トピックを外しています:私は 'shell'の代わりに' proc'を使います - 後者は慎重なエスケープを必要とし、非常に壊れやすく、前者は引数を取るだけです。 – chi

答えて

1

使用readCreateProcess

readCreateProcess :: CreateProcess -> String -> IO String 

追加Stringが標準入力としてコマンドに渡されます。