2016-11-04 5 views
1

単純なF#のスクリプト:なぜ入力リダイレクトがsudoではデフォルトで動作し、passwdでは動作しないのですか? (.NET)

#!/usr/bin/env fsharpi 

open System 
open System.Diagnostics 

let Exec (command: string, arguments: string, echo: bool) = 
    let psi = new System.Diagnostics.ProcessStartInfo(command) 

    psi.Arguments <- arguments 
    psi.UseShellExecute <- false 
    if (echo) then 
     Console.WriteLine("{0} {1}", command, arguments) 
    let p = System.Diagnostics.Process.Start(psi) 
    p.WaitForExit() 
    p.ExitCode 

Exec("sudo", "-k ls -lha /root", true) 
Exec("passwd", "myusername", true) 

(しかし、あなたがC#で同じことを書くことができますので、実際にこれは、私が推測する問題の一般的な "Linuxで.NET" です)

なぜ最初のExec()コールは機能し、2番目のコールは機能しません。

最初のものは適切にsudoを呼び出し、sudoは(私もそれを入力するために失敗することができ、そしてそれは標準入力で採用キャリアリターンの数に関係していないので、それは、再び私にそれを頼む)私のパスワードの入力を要求。

しかし、2番目の文字では1文字しか書き込めず、突然ドロップアウトします。後者は完全なパスワードを書かせることができず、パスワードが一致しないと言っても失敗するので、文字をpasswdに正しくリダイレ​​クトしないようです。

誰かがこれを説明できますか?

答えて

2

デフォルトでは、passwdは通常(通常はセキュリティ上の理由から)標準I/Oを使用しません。 passwdのマニュアルページで、stdioを有効にするオプションがあるかどうかを確認できます。 passwd --stdin。そうでない場合は、chpasswdのような別のユーティリティを使用する必要があります。

まったく、.NETとは関係ありません。シェルからも同じことをすることはできませんでした。パスワードは、アプリケーションやスクリプト用ではなく、ユーザー用です。

+0

「passwd」は、パスワードをstdinから取得していない場合、どのようにして収集できますか? – knocte

+0

@knocte端末から直接。標準入力ストリームは単なるテキストストリームであることを忘れないでください。標準出力にテキストカーソルが配置されていないかのように、マスクされた入力や隠された入力などには使用できません。これはWindowsでも同じですが、Console.WriteLineとConsole.CursorTopだけを使用する場合の違いは、例えば:)です。「出力ストリームに別の文字を追加する」よりも複雑な操作を行うコンソールアプリケーションが表示された場合、それはstdioを使用していないことを知っている。 – Luaan

関連する問題