Cha*_*ard 24 permissions command-line bash chmod gnu
我跑去chmod 222 /bin/chmod
了解更多chmod
。之后,当我跑步时/bin/chmod
,我得到了permission denied
。
我尝试将 的权限更改chmod
为 back 755
,但不起作用。
有人有关于如何解决这个问题的提示吗?
raj*_*raj 45
你使chmod
不可执行。
有三种(不,实际上是四种)选项可以从这种情况恢复:
重新安装该软件包,如Artur Meinild 的回答coreutils
中所述。
我的首选解决方案:
从安装介质启动并启动实时 Ubuntu 会话。
启动磁盘应用程序,找到 Ubuntu 安装所在的分区并安装它。请注意分区的安装路径(类似于/media/username/somename
)。
打开终端并运行:
sudo chmod 755 /media/username/somename/usr/bin/chmod
Run Code Online (Sandbox Code Playgroud)
卸载分区,关闭实时会话并从正常安装中重新启动。
这样做时要非常小心!运行以下命令:
sudo cp -p /usr/bin/ls /tmp/chmod
sudo cp /usr/bin/chmod /tmp/chmod
sudo /tmp/chmod 755 /usr/bin/chmod
Run Code Online (Sandbox Code Playgroud)
说明:首先,我们将另一个仍然可执行的文件(我选择/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)'
Run Code Online (Sandbox Code Playgroud)
Raf*_*ffa 26
dpkg-statoverride
dpkg-statoverride
默认情况下在 Ubuntu 上可用...它的主要目的是覆盖文件的所有权和模式...您可以像这样使用它:
sudo dpkg-statoverride --update --add root root 755 /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\nrsync
rsync
默认情况下在 Ubuntu 上可用...在--archive, -a
模式下,它应该只设置权限(因为文件永远不会更改)...即在一次使用时如下所示:
sudo rsync -a --chmod=755 /bin/chmod /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\ninstall
命令还有另一个install
从GNU 核心实用程序调用的实用程序,默认情况下在您的系统 \xe2\x80\xa6 上应该可用它\xe2\x80\x99s 主要用于复制刚刚编译的文件并使它们可执行,即安装它们,因此name \xe2\x80\xa6 默认情况下它应该为复制的文件提供权限rwxr-xr-x
...它还可以选择-m
动态选择性地更改该文件的权限(虽然在这种情况下您可能不需要该选项,因为默认值应该足够了),但你总是可以这样做:
sudo install -m +x /bin/chmod mychmod\n
Run Code Online (Sandbox Code Playgroud)\n然后,您可以简单地执行以下操作:
\nsudo ./mychmod 755 /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\n另一个简单的解决方案是使用动态链接器/加载器本身...这是运行二进制文件的一种特殊方式,因为它不需要\xe2\x80\x99t 的权限来执行此操作(这有点类似于运行不可执行的文件) shell 脚本,将其作为参数传递给/bin/sh
例如) \xe2\x80\xa6 根据编译二进制文件的体系结构,您很可能希望使用amd64
变体...在您的系统上查找其名称和路径,例如:
$ dpkg -S \'ld-linux*\'\nmanpages: /usr/share/man/man8/ld-linux.8.gz\nmanpages: /usr/share/man/man8/ld-linux.so.8.gz\nlibc6:amd64: /lib64/ld-linux-x86-64.so.2\nlibc6:i386: /lib/i386-linux-gnu/ld-linux.so.2\nlibc6-i386: /lib32/ld-linux.so.2\nlibc6:i386: /lib/ld-linux.so.2\nlibc6:amd64: /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2\n
Run Code Online (Sandbox Code Playgroud)\n然后,只需一次性使用它,如下所示:
\nsudo /lib64/ld-linux-x86-64.so.2 /bin/chmod 755 /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\n在您的系统中搜索可以更改/设置文件权限的其他实用程序...一种方法是搜索手册,例如man -K "chmod"
...以下是我在系统上找到的一些内容:
chacl
(更改文件或目录的访问控制列表):
sudo chacl u::rwx,g::r-x,o::r-x /bin/chmod\n
Run Code Online (Sandbox Code Playgroud)\nbwrap
(容器设置实用程序):
sudo bwrap --die-with-parent --bind / / --chmod 755 /bin/chmod -- /bin/true\n
Run Code Online (Sandbox Code Playgroud)\n
Art*_*ild 23
你做了唯一不应该做的事情chmod
- 你将chmod
自身更改为不可执行。即使是 的权力也不sudo
会让这个命令再次起作用(以其当前的形式 - 但请参阅其他答案)。
让它再次工作的方法是使用以下命令重新安装 GNU coreutils 软件包:
sudo apt install --reinstall coreutils
Run Code Online (Sandbox Code Playgroud)
一般提示(这对于 Linux 实用程序尤其重要):在学习某些内容时,首先阅读每个命令的作用,然后在隔离环境(容器/虚拟机)中尝试一些内容,只有在此之后,您才可以在自己的计算机上运行命令。生产系统。
小智 13
除了所有其他答案之外,如果您已busybox
安装,则可以通过运行以下命令来使用它:
sudo busybox chmod 0755 /usr/bin/chmod
Run Code Online (Sandbox Code Playgroud)
Busybox 可以通过启用universe
存储库来安装,然后运行:
sudo apt update && sudo apt install busybox
Run Code Online (Sandbox Code Playgroud)
Jos*_*hua 12
随着即时tar
模式的改变(该#
符号意味着该命令应该以 root 身份运行):
# cd /bin
# tar -mode 755 -cf chmod.tar chmod
# tar -xf chmod.tar
Run Code Online (Sandbox Code Playgroud)
旧答案调用hexedit
:
# cd /bin
# tar -cf chmod.tar chmod
# hexedit chmod.tar
Run Code Online (Sandbox Code Playgroud)
修复压缩包内的权限;这是0000222
; 将其更改为0000755
. 然后运行:
# tar -xf chmod.tar
Run Code Online (Sandbox Code Playgroud)