2016-11-04 30 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) 

(但其實這是一個通用的 「.NET在Linux上」 的問題,我猜,因爲你可以寫同樣在C#)

爲什麼第一個Exec()調用起作用,第二個不起作用?

第一個叫須藤正常,而須藤問我要我的密碼(我甚至可以不輸入它,它再次問到我,所以它不是關係到標準輸入採用載波回報數) 。

但是,第二個只允許我寫一個字符並突然退出。它似乎沒有正確地將字符重定向到passwd,因爲後者不讓我寫完整的密碼,並且沒有說密碼不匹配。

有人可以解釋這一點嗎?

回答

2

默認情況下,passwd通常不使用標準I/O(主要是出於安全原因)。您可以查看您的passwd的手冊頁,以查看是否有啓用stdio的選項 - 例如, passwd --stdin。如果不是,則需要使用其他實用程序,例如chpasswd。總而言之,與.NET毫不相干。你無法從你的shell執行相同的操作:)密碼不適用於應用程序或腳本 - 它們是爲用戶提供的。

+0

如果passwd不是從標準輸入中收集密碼,它怎麼能收集密碼呢? – knocte

+0

@knocte直接從終端。不要忘了,標準輸入流只是一個文本流 - 你不可能將它用於諸如屏蔽或隱藏輸入之類的東西,就像沒有在標準輸出中定位文本光標一樣。在Windows上也是如此 - 例如只使用'Console.WriteLine'和'Console.CursorTop'之間的區別:)如果您看到一個控制檯應用程序執行比「向輸出流添加另一個字符」更復雜的任何操作,知道它不使用stdio。 – Luaan

相關問題