【问题标题】:How to run app as sudo如何以 sudo 运行应用程序
【发布时间】:2018-07-20 11:30:37
【问题描述】:

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

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

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

我该怎么做:

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

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

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

【问题讨论】:

  • 在 Windows 上,我将使用 runas 启动我的程序的第二个实例,并提升权限以执行所需的修改。我认为使用 sudo 应该可以做到这样的事情。
  • 是的,windows 不是问题......但我需要尽可能专业。打开终端询问您的密码不会减少它。其他应用程序在需要提升权限时提示我输入指纹或密码,所以一定有可能
  • 是的,应该有一些系统组件可以调用来执行此操作。但是我对osx不熟悉,不能告诉你是哪一个。
  • 会成为 App Store 应用吗?还是临时安装?
  • @BlackSpy 我会在 Xamarin.Mac 中以编程方式使用 AppleScript,它使用具有管理员权限的 shell。 (我在我的代理风格应用程序中使用这种方式)。 AuthorizationExecuteWithPrivileges 自 10.7 以来已被弃用,使用 SMJobBless 和 XPC 是为您的用例设置的痛苦(并且您需要一个 Apple Developer 许可证才能获得您必须签署两个应用程序的证书)。如果你需要一个简单的让我知道,我会添加一个答案...

标签: c# macos xamarin .net-core


【解决方案1】:

感谢@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 中解决这个问题,但看起来我需要完成的小任务相当投入。

【讨论】:

    【解决方案2】:

    在你的应用启动脚本中你想要这个。

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

    更多信息在这里:Getting sudo to ask for password via the GUI

    【讨论】:

    • 我似乎无法找到解决方案甚至包内容中存在的引导脚本。你知道地点吗?
    • 通常在包文件夹中通常 MyCoolApp.app 通常有一个 bash 脚本只是称为包名 MyCoolApp 您可以使用它来创建使用 osascript。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 2014-11-24
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多