如何从非管理员用户会话中以管理员身份运行GUI应用程序?

我定义了2个用户帐户:

  • 一个具有管理员权限(使用sudo权限)=>让我们称之为adminuser
  • 没有任何特权的第二个=>让我们称它为normaluser
    我在这个第二个用户normaluser上配置了自动登录。

因此,当我打开一个normaluser会话并希望运行具有管理员权限的应用程序时,
我打开一个终端Ctrl + Alt + T并:

 su adminuser sudo anyapplication ... 

它工作正常,无需退出normaluser会话(无需打开normaluser会话)。


但是,如果应用程序需要使用GUI(图形用户界面)运行,我该怎么办?
我虽然这样:

 su adminuser gksu anyapplication ... 

但我明白了

 ** (gksu:9122): WARNING **: the connexion is closed No protocol specified No protocol specified (gksu:9122): Gtk-WARNING **: cannot open display: :0.0 

术语

在这个答案中:

  • normaluser是一个普通用户,不是管理员,不能以root身份运行sudo
  • admin是一个管理员,可以使用sudoroot身份运行命令。 (当然,任何图形命令都应该使用像gksu / gksudo这样的图形前端 ,而不是直接使用sudo 。)
  • anyapplicationnormaluser想要以root身份运行的图形应用程序的名称。 normaluser知道admin的密码,并且(可能)被告知他/她可能会将其用于此目的。

问题

你的问题的原因,以及迄今为止大多数其他答案不起作用的原因( Marty Fried的优秀答案除外)是:

  • gksu可以配置为使用sudo su作为其后端。 Ubuntu中gksu的默认行为是充当sudo的前端, 而不是 su 。 也就是说,默认情况下, gksugksudo表现完全相同 。 请参阅联机帮助页 。
  • normaluser不是管理员,因此无法以sudo身份运行root sudosudo提示输入运行它的用户的密码,而不是他们想要成为的用户的密码。 无法使用您的密码执行操作,因为不是您的人是不是管理员的意思
  • normaluser ,如果它不是Guest帐户, 可以 su作为另一个用户运行命令,输入其他用户的密码 。 但是gksusudo的前端,而不是su
  • normaluser不能直接root身份运行任何命令,因为normaluser不能使用sudo ,因为没有root密码,所以没有人可以成为su root用户

解决方案

该解决方案需要编写执行两个身份validation步骤的命令:

  • normaluser必须成为admin才能运行图形命令。 为此, normaluser必须使用-w标志运行gksu以使其以su模式运行而不是默认的sudo-mode ,并使用-u标志以admin而不是root运行命令。
  • admin身份运行的命令必须在没有 -w标志的情况下调用gksu才能使用sudo成为root

这是命令 (是的,我测试了它😉 ):

 gksu -w -u admin gksu anyapplication 

系统将提示您输入两次密码:

  1. 首先,您必须输入admin的密码,让normalusersu后端作为admin运行命令。
  2. 其次,你必须输入admin的密码,让adminsudo后端的root身份运行命令。

那就对了。 您输入admin密码两次。

杂项说明:

  • 如果您愿意,可以用gksudo替换第二个gksu ,以减少混乱。 在Ubuntu中,它们是等价的。 (你也可以用gksudo替换第一个gksu ,但这会非常违反直觉和令人困惑。)
  • -w--su-mode的缩写forms。
  • -S--sudo-mode的缩写forms,但--sudo-mode使用,因为sudo-mode是默认模式
  • 您可能希望首先使用一些非常无害的命令来测试它,以确保它能够满足您的需求。 (它会,但你不需要相信我。)例如:
     gksu -w -u admin gksu xclock 

    xclock是一个很好的简单时钟窗口应用程序。

一种可能有效的方法是在第一次切换到admin用户时使用“sux”而不是“su”。 sux修复了从欺骗用户运行x应用程序的问题。 它在标准sudo apt-get install sux中,可以通过在命令行输入sudo apt-get install sux

然后,只需使用“sux”而不是“su”,它应该按照您期望的方式工作。

让我们重用应用程序xclock的例子:

 sux admin gksu xclock 

PAM可以照顾它

这适用于Ubuntu 16.04:

放线:

 session optional pam_xauth.so 

在某处:

 /etc/pam.d/su 

和/或

 /etc/pam.d/sudo 

然后做“su – ”或“sudo su – ”我可以使用图形应用程序作为root。

pkexec

kdesudo和gksu – pkexec是一种无处不在的替代品,它来自许多软件包所需的policykit-1软件包。

代替

  su admin
 gksu任何应用...... 

我建议你尝试使用gksu -u admin anyapplication ,你可以使用gksu命令自行完成所有操作。 另请注意,您必须输入命令中提到的用户的密码,即,在这种情况下,您必须输入admin的密码。

这是完成此任务的命令。

 gksu app-name 

先运行它而不先运行su 。 您只需要从普通用户会话运行上述命令,应用程序将以root身份运行。

你应该使用:

 gksudo AppName 

这首先会显示一个图形密码请求(您的用户密码),然后以root身份启动GUI-app(我刚试过,它确实这样做。有趣的是:我之后立即尝试了gksu AppName ,这也很有效 – 就像它可能应该是,正如“gk”前缀所暗示的那样。所以我不能完全确定你的问题可能位于何处)。

只有一个超级用户,这是root用户。

用户1是管理员并具有sudo权限。
用户2不是管理员,也没有sudo权限。

尝试以用户1身份登录,然后使用该命令

 gksudo app-name 

(用应用名称替换app-name)
希望有所帮助 – 让我知道。 :O)

编辑:根据要求提供更多信息

如果只是你在电脑上,
然后使用用户1(谁有权使用sudo)
与使用用户2(谁没有使用sudo的权限)没什么不同。
用户1具有与用户2相同的权限。
除非用户1发出带有sudo前缀的命令和/或提供密码以允许应用程序使用root privelages运行。
唯一的区别是用户2无法以root身份运行应用程序。

希望有助于为您解释一下。 :O)