c# - 如何以 sudo 运行应用程序
问题描述
我编写了一个 .NET Core Mac OSX 菜单代理应用程序(即 UI 是菜单栏中带有上下文菜单的图标)。
此应用程序的功能之一是主机文件更新(即从 /etc/hosts 添加/删除条目)。但是要写入文件,您需要 sudo 权限。
文件更新使用System.IO.File.WriteAllText
.
我怎么能:
以 sudo 方式启动应用程序(以某种方式提示),同时仍允许用户单击应用程序而不是从终端启动,或者
以某种方式为 File.WriteAllText 命令提供 sudo 访问权限(在需要时提示用户)。
简而言之,我需要做什么才能提供更新主机文件的访问权限?
解决方案
感谢@SushiHangover 的建议,我终于找到了解决方案,这导致了以下帖子:https ://forums.xamarin.com/discussion/103039/xamarin-mac-multiple-do-shell-script-with-administrator-privilege -with-one-password-request
我没有使用System.IO.File
静态方法直接写入主机文件,而是写入临时文件。然后我启动命令以使用该方法cat
用临时文件的内容覆盖主机文件的内容。ExecuteWithPrivileges
这会显示 Mac 默认提示输入用户密码,并且cat
命令作为 sudo 执行。
private static void WriteToHostsFile(IEnumerable<HostEntry> hostEntries, IHostsFileWriter hostsWriter)
{
var hostsText = hostsWriter.GetHostsFileText(hostEntries);
var fi = new FileInfo("hoststemp.txt");
File.WriteAllText("hoststemp.txt", hostsText);
var defaults = Security.AuthorizationFlags.Defaults;
using (var auth = Security.Authorization.Create(defaults))
{
auth.ExecuteWithPrivileges("/bin/cat", defaults, new[] { fi.FullName + " > /etc/hosts" });
}
}
应该注意的是,此方法已被标记为已弃用,有利于 SMJobBless:https ://developer.apple.com/library/archive/samplecode/SMJobBless/Introduction/Intro.html
不过,我还没有设法在 Xamarin 中解决这个问题,并且看起来非常参与我需要完成的小任务。
推荐阅读
- python - 如何用python填充和提交html文本框
- terraform - Terraform 摧毁了 GitHub 团队,而不是为新成员更新它
- amazon-web-services - 如何在 SageMaker 中使用预构建的深度学习算法?
- ios - React-Native 新的 ios 项目未构建。RCT-Folly 语义问题
- asp.net - Blazor 按键事件和 KeyCodes
- entity-relationship - 带有 OR 条件的 ERD
- java - 如何将标头添加到 Web 服务的失败响应中?
- python - 添加两个整数列表
- azure-cosmosdb - Azure 函数尝试将“WHERE ... IN”与 Cosmos DB 绑定一起使用
- amazon-web-services - 如何使用 Lambda 将文件从“文件夹”A 复制到同一存储桶上的文件夹 B