提问人:togarha 提问时间:11/17/2023 最后编辑:togarha 更新时间:11/18/2023 访问量:36
在 Linux 中以更高的权限和密码运行 c# 进程
Running c# Process with higher privileges and password in Linux
问:
我正在尝试使用带有美元符号 ($) 的密码在 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\""
所有这些都具有相同的结果。
我也尝试过使用 代替 ,但结果相同。ArgumentList
Arguments
有什么想法可以让它工作吗?
更新: 我已将密码更改为不带美元符号的密码以避免将其大写,并且我仍然遇到同样的问题,因此问题不是大写美元符号,而是将 pwd 注入到进程中
答:
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 台计算机上进行了测试,它工作正常,我不知道为什么我测试的第一台计算机仍然无法正常工作,但似乎只与一台计算机相关,所以我们可以说这是一个很好的解决方案
评论