我跑步是chmod 222 /bin/chmod
为了了解更多chmod
。之后,当我跑步时/bin/chmod
,我得到了permission denied
。
我尝试将 的权限改chmod
回755
,但是没有效果。
有人知道如何解决此问题吗?
答案1
您使之chmod
不可执行。
有三个(不,实际上是四个)选项可以恢复这种情况:
重新安装
coreutils
软件包,如Artur Meinild 的回答。我喜欢的解决方案:
从安装介质启动并开始实时 Ubuntu 会话。
启动磁盘应用程序,找到 Ubuntu 安装所在的分区并挂载它。记下分区挂载的路径(类似于
/media/username/somename
)。打开终端并运行:
sudo chmod 755 /media/username/somename/usr/bin/chmod
卸载分区,关闭实时会话并从正常安装中重新启动。
执行此操作时请务必小心!运行以下命令:
sudo cp -p /usr/bin/ls /tmp/chmod sudo cp /usr/bin/chmod /tmp/chmod sudo /tmp/chmod 755 /usr/bin/chmod
解释:首先,我们将另一个仍可执行的文件(我选择了
/usr/bin/ls
)复制到/tmp/chmod
。通过使用命令-p
的参数cp
,我们保留了权限,因此我们确保生成的文件也是可执行的。接下来,我们
/tmp/chmod
用实际的内容覆盖刚刚创建的文件/usr/bin/chmod
,但是没有保留权限。 的内容/tmp/chmod
将被实际的 覆盖chmod
,但仍可执行。所以我们可以用来
/tmp/chmod
恢复实际的权限/usr/bin/chmod
。或者,我们可以删除
/tmp/chmod
不再需要的,但这不是必需的;下次系统启动时,/tmp
目录无论如何都会被清除。您可以使用任何支持
chmod()
系统调用的编程语言。由于 Ubuntu 默认包含 Python 解释器,因此使用 Python 可能是最简单的方法:sudo python3 -c 'import os; os.chmod("/usr/bin/chmod", 0755)'
答案2
和dpkg-statoverride
dpkg-statoverride
在 Ubuntu 上默认可用...其主要目的是覆盖文件的所有权和模式...您可以像这样使用它:
sudo dpkg-statoverride --update --add root root 755 /bin/chmod
和rsync
rsync
在 Ubuntu 上默认可用...在--archive, -a
模式下,它应该只设置权限(因为文件永远不会改变)...即像这样一次性使用:
sudo rsync -a --chmod=755 /bin/chmod /bin/chmod
使用install
命令
还有另一个实用程序叫做install
从GNU 核心实用程序以及默认情况下应在系统上可用的...它主要用于复制刚编译的文件并使其可执行,即安装它们,因此得名...它应该rwxr-xr-x
默认为复制的文件提供权限...它还可以-m
选择动态更改该文件的权限(但在这种情况下你可能不需要这个选项,因为默认设置就足够了),但你始终可以这样做:
sudo install -m +x /bin/chmod mychmod
然后,您只需执行以下操作即可:
sudo ./mychmod 755 /bin/chmod
使用动态链接器/加载器
另一个简单的解决方案是使用动态链接器/加载器本身...这是一种运行二进制文件的特殊方式,因为它不需要权限(这有点类似于运行一个不可执行的 shell 脚本,将其作为参数传递给/bin/sh
例如)...根据您二进制文件编译的体系结构,您很可能想要使用变amd64
体...在您的系统上找到它的名称和路径,例如:
$ dpkg -S 'ld-linux*'
manpages: /usr/share/man/man8/ld-linux.8.gz
manpages: /usr/share/man/man8/ld-linux.so.8.gz
libc6:amd64: /lib64/ld-linux-x86-64.so.2
libc6:i386: /lib/i386-linux-gnu/ld-linux.so.2
libc6-i386: /lib32/ld-linux.so.2
libc6:i386: /lib/ld-linux.so.2
libc6:amd64: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
然后,只需像这样一次性使用它:
sudo /lib64/ld-linux-x86-64.so.2 /bin/chmod 755 /bin/chmod
别的 ...
在您的系统中搜索其他可以更改/设置文件权限的实用程序...一种方法是使用例如搜索手册man -K "chmod"
...以下是我在系统上找到的一些内容:
chacl
(更改文件或目录的访问控制列表):
sudo chacl u::rwx,g::r-x,o::r-x /bin/chmod
bwrap
(容器设置实用程序):
sudo bwrap --die-with-parent --bind / / --chmod 755 /bin/chmod -- /bin/true
答案3
你做了最明显的事情之一绝不处理chmod
- 你将chmod
其自身更改为不可执行。即使是意志的力量也无法sudo
使此命令再次起作用(以其当前形式 - 但请参阅其他答案)。
使其再次运行的一种方法是使用以下命令重新安装 GNU coreutils 包:
sudo apt install --reinstall coreutils
一个通用提示(对于 Linux 实用程序尤其重要):当学习某件事时,第一的了解每个命令的作用,第二在隔离环境(容器/虚拟机)中尝试一些东西,并且只在那之后您是否应该在生产系统上运行命令。
答案4
通过动态tar
模式更改(#
符号表示该命令应以 root 身份运行):
# cd /bin
# tar -mode 755 -cf chmod.tar chmod
# tar -xf chmod.tar
旧答案hexedit
:
# cd /bin
# tar -cf chmod.tar chmod
# hexedit chmod.tar
修复 tarball 中的权限;它是0000222
;将其更改为0000755
。然后运行:
# tar -xf chmod.tar