以root权限从终端运行GUI应用程序


4

因此,它已经有据可查的GUI应用程序(如gedit中或文本编辑)应使用sudo运行。Ubuntu等人获得了gksu和gksudo(等等),所以问题:WE(Mac用户)得到了什么?鉴于Darwin内核是基于某些* BSD代码构建的,因此我认为同样的问题同样适用,但是我们如何解决呢?


1
现在,这个问题似乎相当广泛,您能否在这里更具体地说明要解决的现实问题?
nohillside

@patrix,我之所以问是因为这个想法浮现在我的脑海。一年前,我不得不编辑几个主机文件,所以我成为root并从那里运行TextEdit。我想知道是否有更好的方法。
agentroadkill 2014年

Answers:


3

/etc/hosts使用Sublime Text 编辑:
sudo /Applications/Sublime\ Text.app/Contents/MacOS/Sublime\ Text /etc/hosts

如果您必须定期执行此操作,则可以将此代码段添加到〜/ .bash_profile中

#   sudoapp: Runs .app with root privileges
#   Usage: sudoapp /Applications/Name.app /etc/hosts
#   --------------------------------------------------------------------
    sudoapp () {
        sudo "$1/Contents/MacOS/$(defaults read "$1/Contents/Info.plist" CFBundleExecutable)" $2
    }

以root特权运行的应用程序将用/private/var/root作主文件夹,因此将在进程中创建的root拥有的所有配置文件和临时文件将保留在应有的位置- root主目录中。
这与以root用户身份登录并运行应用程序相同,但是没有用户切换的麻烦。

此方法适用于10.6-10.11

更新:如果在10.11和更高版本中以root身份运行,Apple自己的TextEdit拒绝启动,因此我将示例更改为使用Sublime Text


因此,这将保留我当前的配置文件,并创建root拥有的其他文件?这似乎是使用来运行GUI应用程序的最大危险sudo
agentroadkill 2014年

不,这是正确的行为,因为在〜/ Library中具有随机根创建的文件才是真正的PITA。
谢尔盖(Sergei)2014年

但是,当我退出root拥有的Finder实例时,这些文件不是由root拥有吗?chown每次执行此操作时,我都不想要很多配置文件。
agentroadkill 2014年

无需整理任何东西,GUI应用程序尊重用户目录。根GUI应用程序创建的所有config / tmp文件都将保留在/ private / var / root中,并由root拥有-应当如此。这与以root用户身份登录并运行应用程序相同,但是没有用户切换的麻烦。
Sergei

1
不知何故我误读了您的第一条评论,并以为您说的是保留当前配置文件是一个问题。对于那个很抱歉。
谢尔盖(Sergei)2014年

3

虽然可以以root用户身份启动图形应用程序,但不建议这样做。在大多数情况下,它可能会起作用,但请避免依赖此行为。

避免生根

不建议以root用户身份运行应用程序,因为它会大大增加导致Mac问题的风险。root的使用应仅限于具有适当控制的最小代码段。

应用程序越来越趋向于分散的设计,以避免对不需要它的代码暴露过多的能力。

  • 以root权限运行的代码中的错误会带来安全风险。
  • 没有root权限的代码错误导致严重问题的能力要小得多。

有边际案例,但这种情况越来越少。沙盒和XPC的引入是Apple减少对OS X上运行的进程提供过多权限的需求的一部分。

命令行工具

如果你需要处理文件作为root用户,使用命令行工具,例如vimemacsnano。这些工具不依赖WindowServer,可以愉快地在另一个用户会话中以root身份启动:

sudo nano <path to edit>

图形工具

如果您喜欢图形编辑器,请使用与Mac OS X一起使用的编辑器 。BBEdit是出色的编辑器,可以正确处理根目录拥有的文件的编辑。

当您使用BBEdit编辑根目录拥有的文件时,将使用第二个过程来弥合您与文件所有者之间的权限差距。此过程通过了Apple认可的途径,从而确保了可预测的体验-希望跨多个主要版本的Mac OSX。

为什么?WindowServer限制和设计范围

在另一个用户会话中启动图形应用程序存在一些细微的技术问题。

潜在的技术问题源于一个用户想要在另一用户的会话中启动图形过程。Mac OS X的WindowServer从未以此为目标进行设计。即便是root用户,用户会话也很难突破–出于所需的安全性考虑。

苹果在Mac OS X的最后几个主要版本中大大改进了WindowServer设计。现在,可以通过屏幕共享让多个用户在一台Mac上登录不同的图形会话。这项看似简单的改进依赖于苹果工程师的大量幕后工作。

但是,Apple不太可能提供一种简单的方法来跨单个应用程序中的不同用户交叉启动应用程序。这将如何使他们的客户受益?

如果要进一步探索此主题,请launchctl在其他活动的用户会话中查找涉及并运行应用程序的问题。


JFYI自OS X 10.6起,我一直在使用答案中描述的方法,但从未遇到过任何问题。WindowServer是故意设计还是偶然设计的,这超出了我的了解,但是它可以很好地处理sudo应用程序。我想整个“不推荐”的故事都
Sergei 2014年

因此,似乎在这里跳舞的是,具有root特权的应用程序将创建一些配置文件(或其他文件),这些文件可能是持久的,但由拥有root。这显然很糟糕,但是很少发生。为了争辩,让我们假装我想从终端打开Disk Utility的实例,但是要在图形会话中。我是否应该打开它并等待它征求我的许可?
agentroadkill 2014年

在这种情况下,请使用命令行工具diskutil代替该应用程序:dssw.co.uk/reference/diskutil.html在Mac OS X上,您无需直接以root用户身份运行任何图形应用程序。如果需要其他权利,则该图形应用程序应为您组织这些权利,并让您根据适当的权利进行身份验证:dssw.co.uk/reference/authorization-rights
Graham Miln

我经常以root用户身份运行X11应用程序而没有问题。
Max Ried 2014年

1

有充分的理由不以根用户身份编辑文件。为什么不将它们复制到一个临时文件中,然后编辑并复制回来。

visudo尽管这需要一些知识vi,但是您可以使用,但是可以对/etc/fstab或类似内容进行简单更改。

您可以尝试设置EDITOR环境变量并运行,visudo尽管我从未使用图形编辑器进行过尝试。


看不到与该问题的任何联系。
Max Ried 2014年

0

Sergei的答案在OS X 10.8.5上不适合我

$ sudo /Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts

我收到权限错误消息

错误

由于先sudo输入二进制文件,然后双击Finder中的文件,因此我想到了以下不太简单的命令

$ sudo -b /Applications/TextEdit.app/Contents/MacOS/TextEdit && sleep .5 && open -a /Applications/TextEdit.app /etc/hosts

如果需要,您可以像Sergei一样使用它。


在新的Mac OS版本中,Apple专门对TextEdit进行了某些操作,以防止它与sudo一起使用。其他应用程序正常工作。我更改了答案,以使用Sublime Text为例。
谢尔盖

感谢您的单挑,但您能更具体一点吗?也许先检查TextEdit二进制文件上的标志?
1.61803
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.