【问题标题】:Why input redirection works by default for sudo and not for passwd? (.NET)为什么输入重定向默认适用于 sudo 而不是 passwd? (。网)
【发布时间】:2017-03-18 08:06:20
【问题描述】:

简单的 F# 脚本:

#!/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)

(但实际上我猜这是一个通用的“Linux 上的 .NET”问题,因为你可以用 C# 编写同样的问题)

为什么第一个 Exec() 调用有效而第二个无效?

第一个正确调用 sudo,sudo 要求我输入密码(我什至可能无法输入密码,它会再次向我询问,因此它与 stdin)。

然而,第二个只允许我写一个字,突然就掉线了。它似乎没有正确地将字符重定向到passwd,因为后者不允许我写完整的密码,并且无法说密码不匹配。

谁能解释一下?

【问题讨论】:

    标签: c# .net linux f# stdin


    【解决方案1】:

    默认情况下,passwd 通常不使用标准 I/O(主要是出于安全原因)。您可以查看 passwd 的手册页,看看是否有启用 stdio 的选项 - 例如passwd --stdin。如果没有,您将需要使用其他实用程序,例如 chpasswd

    总而言之,与 .NET 无关。你也不能在你的 shell 中做同样的事情 :) 密码不是用于应用程序或脚本的——它们是用于用户的。

    【讨论】:

    • 如果密码不是来自标准输入,passwd 怎么能收集到密码?
    • @knocte 直接从终端。不要忘记,标准输入流只是一个文本流——你无法将它用于屏蔽或隐藏输入之类的东西,就像在标准输出中没有文本光标的定位一样。在 Windows 上也是如此 - 仅使用 Console.WriteLineConsole.CursorTop 之间的区别,例如 :) 如果您看到一个控制台应用程序执行的操作比“向输出流中添加另一个字符”更复杂,您知道它没有使用标准输出。
    猜你喜欢
    • 2019-06-22
    • 1970-01-01
    • 2014-04-16
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2018-02-15
    相关资源
    最近更新 更多