如何以sudo方式运行应用

时间:2018-07-20 11:30:38

标签: c# macos xamarin .net-core

我已经编写了.NET Core Mac OSX菜单代理应用程序(即,UI是菜单栏中带有上下文菜单的图标)。

此应用程序的功能之一是主机文件更新(即,从/ etc / hosts添加/删除条目)。但是要写入文件,您需要sudo权限。

文件更新使用System.IO.File.WriteAllText重新写入了整个文件。

我该如何:

  1. 以sudo方式启动应用程序(以某种方式提示),同时仍允许用户单击应用程序而不是从终端启动,或者

  2. 以某种方式为File.WriteAllText命令提供sudo访问(在需要时提示用户)。

简而言之,我该怎么做才能提供访问权限以更新主机文件?

2 个答案:

答案 0 :(得分:0)

在您的应用启动脚本中需要这样做。

/ usr / bin / osascript -e'以管理员权限运行应用程序“ dotnet MyCoolApp”吗?”

此处有更多信息:Getting sudo to ask for password via the GUI

答案 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中解决这个问题,并且看起来非常参与我需要做的小任务。