/etc/sudoers文件损坏,无法通过SSH运行'pkexec visudo'命令。

按照这里的指示,我得到:
pkexec visudo

==== AUTHENTICATING FOR org.freedesktop.policykit.exec ===
Authentication is needed to run `/usr/sbin/visudo' as the super user
Authenticating as: Thomas,,, (tuc) Password:  polkit-agent-helper-1:
error response to PolicyKit daemon:
GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for
cookie
==== AUTHENTICATION FAILED === 
Error executing command as another user: Not authorized

This incident has been reported.

我正在通过ssh进行此操作,因为我所使用的盒子被用作音乐服务器,没有屏幕,而且不太容易访问。这是在我从Ubuntu 14.04升级到16.04时发生的。我尝试从另一个最近的16.04安装中复制sudoers文件,但由于sudoers文件的原因,我无法这样做:
sudo mv ~/gyrf sudoers

>> /etc/sudoers: syntax error near line 36 <<<
>> /etc/sudoers: syntax error near line 37 <<<
>> /etc/sudoers: syntax error near line 38 <<<
>> /etc/sudoers: syntax error near line 39 <<<
>> /etc/sudoers: syntax error near line 40 <<<
>> /etc/sudoers: syntax error near line 41 <<<
>> /etc/sudoers: syntax error near line 42 <<<
>> /etc/sudoers: syntax error near line 43 <<<
>> /etc/sudoers: syntax error near line 44 <<<
>> /etc/sudoers: syntax error near line 45 <<<
>> /etc/sudoers: syntax error near line 46 <<<
>> /etc/sudoers: syntax error near line 47 <<<
>> /etc/sudoers: syntax error near line 48 <<<
>> /etc/sudoers: syntax error near line 49 <<< 
sudo: parse error in /etc/sudoers near line 36    
sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin

我应该从阁楼拿盒子并尝试 pkexec visudo,还是其他地方出了问题?


据我所知,pkexec只允许本地用户(而不是SSH远程用户)这样做 - 所以是的,应该可以在阁楼上运行。 - steeldriver
要么拿到盒子,要么拿到驱动器,将其安装在另一台电脑上并编辑sudoers以适应。取决于哪个更容易。 - vidarlo
@steeldriver,对我来说,作为远程用户,它只是正常工作了。供你参考。 - php-coder
2个回答

我也遇到了这个问题,并通过一些挖掘找到了一个可行的解决方案。原始解决方案来自EstalillaJ的NixOS的GitHub问题
  1. 在目标服务器上打开两个ssh会话。
  2. 在第一个会话中,运行以下命令获取bash的PID: echo $$
  3. 在第二个会话中,使用以下命令启动认证代理: pkttyagent --process (步骤2中的PID)
  4. 回到第一个会话,在其中运行: pkexec visudo
  5. 在第二个会话中,您将收到密码提示。visudo将在第一个会话中启动。

12哇靠,老兄,你救了我的命!谢啦 :D - Roger Barretto
3太疯狂了,它完美地运行!而且不需要重新启动系统。 - undefinedman
3非常感谢,这真的帮了我大忙!⭑ - Frederic
如果我使用非sudo用户会怎样? - sachin_ur
在第二个会话中,你可以简单地输入pkttyagent --process $$而不是从第一个会话中复制进程ID吗? - Tsundoku
2非常感谢你,帮我避免了重启服务器进入恢复模式的麻烦!太感激了! - SergeantSerk
1太棒了,伙计!真希望我也能收藏答案! - Adrian
4我不明白为什么它有效,但它确实有效。 - FarO
这救了我的命,我无法感谢你们的足够! - Rohan
哎呀,真希望在我们把服务器关掉修复错误的sudoer文件之前就找到了这个答案。 - Jeffrey Van Alstine
非常感谢!你救了我一天! - crossmax
2这是一个绝妙的解决办法,适用于像我一样搞砸了sudoers文件的人。如果有人能解释一下就太好了。了解PolicyKit真是太棒了。谢谢。 - Long
3我非常高兴这对你们有所帮助。当我找到那个原始答案时,我也感到非常激动!@Long,根据我的理解,pkexec类似于sudo,可以让你升级到root权限。根据实现方式的不同,它将在用户上查找不同的组(wheel、sudo等)。由于sudoers文件已损坏,sudo无法检查用户是否具有提升特权的权限。我认为两个SSH会话只是pkexec设计的一个怪癖。我主要在桌面环境中看到它作为密码提示。 - Satyen A.
在我无法重新启动、无法物理访问,也无法通过pkexec成功之后,我已经放弃寻找解决方案了。但是这个方法奏效了。非常感谢!(Ubuntu 16.04) - pedrovgp
刚刚救了我的一天 ❤️ - Danila Ganchar
没问题!谢谢你! - Adriano Campos

根据Satyen的回答,这是在Debian 10.4上进行测试的没有能够运行visudo的方法:

  1. 打开两个ssh会话到目标服务器。

  2. 在第一个会话中,通过运行以下命令获取bash的PID:

    echo $$

  3. 在第二个会话中,使用以下命令启动认证代理:

    pkttyagent --process (来自步骤2的pid)

  4. 回到第一个会话,在其中运行:

    pkexec su

  5. 在第二个会话中,将会得到密码提示。su将在第一个会话中启动。

  6. 编辑/etc/sudoers(按CTRL+S保存编辑内容,按CTRL+X退出):

    nano /etc/sudoers