在 Linux 中以更高的权限和密码运行 c# 进程

Running c# Process with higher privileges and password in Linux

提问人:togarha 提问时间:11/17/2023 最后编辑:togarha 更新时间:11/18/2023 访问量:36

问:

我正在尝试使用带有美元符号 ($) 的密码在 Linux 中以更高的权限运行 c# (.net6) 进程,但它总是失败。 我试过:

var stInfo = new ProcessStartInfo
{
    FileName = "echo",
    Arguments = " 'pas$word' | sudo -S ping 127.0.0.1"
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    CreateNoWindow = true,
};

但是我收到所有内容作为 echo 的一部分,stdout 是:

'pas$word' | sudo -S ping 127.0.0.1

然后我尝试以类似的方式使用参数调用 bash,因为它适用于我从终端运行:/bin/bash -c "echo 'pas\$word' | sudo -S ping 127.0.0.1"

var stInfo = new ProcessStartInfo
{
    FileName = "/bin/bash",
    Arguments = "-c \"echo 'pas\$word' | sudo -S ping 127.0.0.1\""
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    CreateNoWindow = true,
};

但这行不通,并通过 stderr 报告了这一点:

[sudo] password for user: Sorry, try again.
[sudo] password for user: 
sudo: no password was provided
sudo: 1 incorrect password attempt

我尝试了不同的参数,例如:

Arguments = "-c \"echo pas$word | sudo -S ping 127.0.0.1\""
Arguments = "-c \"echo 'pas$word' | sudo -S ping 127.0.0.1\""
Arguments = "-c \"echo pas\\$word | sudo -S ping 127.0.0.1\""
Arguments = "-c \"echo 'pas\\$word' | sudo -S ping 127.0.0.1\""
Arguments = "-c \"echo pas\\\\$word | sudo -S ping 127.0.0.1\""
Arguments = "-c \"echo 'pas\\\\$word' | sudo -S ping 127.0.0.1\""

所有这些都具有相同的结果。 我也尝试过使用 代替 ,但结果相同。ArgumentListArguments

有什么想法可以让它工作吗?

更新: 我已将密码更改为不带美元符号的密码以避免将其大写,并且我仍然遇到同样的问题,因此问题不是大写美元符号,而是将 pwd 注入到进程中

C# .NET Linux 进程

评论

0赞 Hamid Molareza 11/18/2023
请使用没有 $ 的密码尝试我的解决方案,如果一切正常,请尝试使用 $ 并告诉我结果。我希望它有用。

答:

1赞 Hamid Molareza 11/18/2023 #1

请试试这个:

using System.Diagnostics;

class Program
{
    static void Main()
    {
        var password    = ""; // Replace with your actual password
        var command     = "/bin/bash";
        var sudoCommand = "ping 127.0.0.1";
        var arguments   = $"-c \"echo '{password}' | sudo -S -p '' {sudoCommand}\"";

        ExecuteCommand(command, arguments);
    }

    static void ExecuteCommand(string command, string arguments)
    {
        var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName               = command,
                Arguments              = arguments,
                RedirectStandardOutput = true,
                RedirectStandardError  = true,
                UseShellExecute        = false,
                CreateNoWindow         = true
            }
        };

        process.Start();

        // Read the output and error streams
        var output = process.StandardOutput.ReadToEnd();
        var error  = process.StandardError.ReadToEnd();

        process.WaitForExit();

        // Display the output and error
        Console.WriteLine("Output:");
        Console.WriteLine(output);

        Console.WriteLine("Error:");
        Console.WriteLine(error);
    }
}

我在 Ubuntu 22 上对此进行了测试,一切都很好。

评论

0赞 togarha 11/18/2023
在带有 .net6 的 Ubuntu 22.04.03 中对我不起作用:“对不起,再试一次。输出: 错误: sudo: 未提供密码 sudo: 1 次密码尝试不正确 ' 密码没有任何美元符号。您使用的是哪个 C# 版本?
0赞 Hamid Molareza 11/18/2023
@togarha .NET 7
0赞 Hamid Molareza 11/18/2023
@togarha,当我没有输入密码或输入的密码错误时,我会看到此错误。请确保您输入的变量正确无误。password
1赞 togarha 11/22/2023
我在其他 3 台计算机上进行了测试,它工作正常,我不知道为什么我测试的第一台计算机仍然无法正常工作,但似乎只与一台计算机相关,所以我们可以说这是一个很好的解决方案