ssh到远程服务器,出于某种原因,执行了
sudo chmod 777 etc/sudoers
这样会在非root用户下把sudoers文件的权限修改,但是Ubuntu下如果想用sudo,就必须让这个文件0440权限,但是现在根本进入不了root用户,也用不了sudo,看似进入了僵局。
在网上搜了很多教程,要么是自己虚拟机的情况下,进入recover mode下进行操作,要么是执行
pkexec chmod 0440 /etc/sudoers
但是这样会报错如下:
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
在ssh远程服务器的背景下,只有方法二看起来靠谱一些,于是又在知乎一篇文章找到了解决办法,这里做出一些解释,原文如下:
linux sudoers文件权限异常解决方法 - 知乎 (zhihu.com)
首先命令是:
pkttyagent -p $(echo $$) | pkexec chmod 0440 /etc/sudoers
执行完就可以用sudo命令了,那这行命令究竟干了些什么呢?
-
echo $$
:这个命令输出当前shell的进程ID(PID)。在shell中,$$
是一个特殊变量,它代表当前shell实例的进程ID。 -
pkttyagent -p $(echo $$)
:pkttyagent
是一个程序,用于为PolicyKit提供文本界面的认证代理。-p
选项后面跟的是一个进程ID,告诉pkttyagent
为哪个进程的PolicyKit请求提供认证服务。通过使用$(echo $$)
,pkttyagent
被告知为当前shell进程提供服务。 -
|
(管道):这个符号在Unix和Linux系统中用于将一个命令的输出作为另一个命令的输入。在这个场景下,它被用来将pkttyagent
的输出(如果有的话)传递给pkexec
命令。 -
pkexec chmod 0440 /etc/sudoers
:pkexec
允许以另一个用户的身份(默认为超级用户)执行命令,这里用来执行chmod 0440 /etc/sudoers
。这个命令的目的是将/etc/sudoers
文件的权限设置为0440,即只有root用户和所属组可以读取该文件,其他人没有任何权限,这是/etc/sudoers
文件的推荐权限设置。
将这些部分组合在一起,整个命令的意图是启动一个pkttyagent
实例来为当前shell进程提供PolicyKit认证服务,然后通过pkexec
以root权限执行chmod 0440 /etc/sudoers
命令,修复/etc/sudoers
文件的权限。这种方法尤其在图形界面不可用或pkexec
无法直接弹出认证对话框时可能会有用。
这个命令的关键在于,它试图在没有图形界面的环境下提供一种方式来执行需要PolicyKit认证的命令,通过为命令行会话提供一个文本界面的认证代理。
那PolicyKit是什么呢?
PolicyKit(现在通常称为polkit)是一个用于管理操作系统级别策略的组件,它允许非特权进程(通常是在桌面会话中运行的进程)向特权进程请求执行特定的操作。它是现代Linux发行版中用于权限控制和安全管理的关键部分,尤其是在图形用户界面(GUI)环境中。具体技术还是比较复杂的,这里不再赘述。