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