首页 > 解决方案 > 如何以 sudo 运行应用程序

问题描述

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

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

文件更新使用System.IO.File.WriteAllText.

我怎么能:

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

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

简而言之,我需要做什么才能提供更新主机文件的访问权限?

标签: c#macosxamarin.net-core

解决方案


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


推荐阅读