我已经编写了.NET Core Mac OSX菜单代理应用程序(即,UI是菜单栏中带有上下文菜单的图标)。
此应用程序的功能之一是主机文件更新(即,从/ etc / hosts添加/删除条目)。但是要写入文件,您需要sudo权限。
文件更新使用System.IO.File.WriteAllText
重新写入了整个文件。
我该如何:
以sudo方式启动应用程序(以某种方式提示),同时仍允许用户单击应用程序而不是从终端启动,或者
以某种方式为File.WriteAllText命令提供sudo访问(在需要时提示用户)。
简而言之,我该怎么做才能提供访问权限以更新主机文件?
答案 0 :(得分:0)
在您的应用启动脚本中需要这样做。
/ usr / bin / osascript -e'以管理员权限运行应用程序“ dotnet MyCoolApp”吗?”
答案 1 :(得分:0)
由于@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
方法用临时文件的内容覆盖hosts文件的内容。这样会在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中解决这个问题,并且看起来非常参与我需要做的小任务。