/usr/bin/chmod
本身删除了执行权限。在这种情况下,如何恢复chmod
并使它再次可执行?比方说,从外部来源获取它或重新编译它不是一种可取的选择,是否有一些聪明的黑客可以自行恢复此chmod
? 请注意,这是很久以前发生的事情,我不是在寻找解决当前问题的解决方案,只是对Unix为我们提供了解决此类问题的方式感到好奇。 >
#1 楼
您可以直接运行加载程序,并将要运行的命令传递给它:/lib/ld-linux.so /bin/chmod +x /bin/chmod
您到加载程序的路径可能会有所不同。在64位系统上,您需要根据
chmod
的编译方式选择正确的版本。 64位版本的名称类似于/lib64/ld-linux-x86-64.so.2
评论
我喜欢每天学习新事物的一天。
– EightBitTony
13年7月21日在19:24
谢谢。 ld-linux.so本身具有什么权限? (我只有cygwin,而且似乎没有此文件。)这是否是覆盖可执行权限位的简便方法?
–sundar-恢复莫妮卡
13年7月21日在19:33
较小的更正:64位库通常在/ lib64下
–布拉奇利
13年7月21日在20:43
在x86(32位)Linux上,动态链接程序必须位于/lib/ld-linux.so.2路径,在x86-64(64位)Linux上,动态链接程序必须位于路径//。 lib64 / ld-linux-x86-64.so.2。通常,这两个都是指向正确文件的符号链接,但是需要提供确切的路径。
–乔纳森·卡伦(Jonathan Callen)
13年7月22日在2:43
@gerrit如果一切都未设置执行位,则可以使用实时CD重新启动系统并重置权限。但是,在那种情况下,重新安装整个系统可能会更容易,因为谁知道在此过程中出现了什么问题。
–贾诺斯·帕斯托(Janos Pasztor)
13年7月22日在10:00
#2 楼
chmod
实用程序依赖于chmod()
系统调用(请参阅man 2 chmod
)。因此,您可以使用几行C或几乎所有其他带有包装器的语言(可能是其中的大多数)来完成此操作。很少有* nix系统缺少C编译器和perl解释器;大多数Linux发行版都需要后者才能工作。perl -e 'chmod 0755, "foobar.file"'
评论
谢谢,太好了。我只是在Perl中进行了尝试,并且效果很好。
–sundar-恢复莫妮卡
13年7月21日在19:28
回复:“大多数Linux发行版都需要[perl解释器]才能工作”:真的吗?你能详细说明一下吗?
–ruakh
13年7月21日在19:55
@ruakh,在基于Debian的系统上,基于perl的软件包被标记为必不可少的。没有perl-base将使软件包管理器感到不满。还有许多其他基本/重要工具,例如adduser,它们需要perl,并以绝对的准系统设置安装。
– Zoredache
13年7月22日在5:24
@ruakh之所以说perl比其他任何东西都更真实,是因为在Linux初期,perl 5就出现了,而python 2则不是。它是原始的“动态类型化,面向对象的解释型”语言。因此,一般来说,Linux世界中最基本的3种语言是1)C,2)bash和3)perl。近年来,Python的流行可能已经使它黯然失色,但是它在历史上并没有那么重要,因此不太可能是必不可少的-尽管实际上两者通常都可以使用。
–金锁
2013年7月22日14:44
@goldilocks:有趣!单一Unix规范确实将cc标记为“ LEGACY”(因此是可选的),但是我没有意识到Linux发行版实际上正在对此进行处理。 :-P(当然,即使作为可选实用程序,它也不会列出perl。)
–ruakh
13年7月22日在16:38
#3 楼
某些系统还安装了busybox
,在这种情况下,您可以运行: /> busybox chmod +x /bin/chmod
现在您有一个可执行的
/bin/chmod
,但实际上是chown
(即其他一些二进制文件)。现在,我们要做的就是用原始二进制文件覆盖它。mv /bin/chmod /bin/chmod.orig
cp -a /bin/chown /bin/chmod
它保留+ x标志,因此您只为此偷了另一个文件的+ x 。
当然,如果所有这些替代二进制文件(包括加载程序,perl,python,gcc等)都是chmod -x,则从应急系统中修复它可能是唯一的选择。 >
评论
您不能只用cat而不是dd吗?
– jw013
13年7月22日在17:18
是的,我最终使用了dd,因为起初我认为它可能需要conv = notrunc或类似内容来防止完全替换文件,但它确实适用于毕竟写入文件的大多数命令(包括cat,cp,... )。
–frostschutz
13年7月22日在17:44
很棒的技巧,真的很聪明
–奇威
14年3月14日在8:49
+1,但是为什么要完全篡改现有的系统文件?为什么不只是cp / bin / tr / bin / newchmod && cp / bin / chmod / bin / newchmod?看来您不需要为cp指定任何选项。 (我之所以选择tr,是因为它是一个名称简短,易于输入的小文件;显然,任何可执行文件(例如/ bin / chown)都可以使用。)
– G-Man说“恢复莫妮卡”
15年8月8日在20:25
@ G-Man,好的一点,对于按时间戳或其他方式跟踪文件的包管理器而言,这种方式可能不会那么混乱。
–frostschutz
15年8月8日在20:51
#4 楼
简单。您可以做的是准备一些其他的可执行文件,然后在其上进行cp chmod
。 cp
可执行文件。第二个chmod
使用ls
的二进制代码填充此文件,同时保留目标文件的执行权限(因为我们未指定任何选项来继承源文件的权限)。另一种方法是使用
cp
实用程序,它是一种美化的复制程序,可以一步设置权限。 (请参阅chmod
参数。) $ cp /bin/ls chmod
$ cp /bin/chmod .
install
程序不是Unix规范的一部分,但可以在BSD和GNU Coreutils中找到。两者都支持-m
选项,具有类似chmod的语法(符号和八进制)。评论
我认为这是这里最简单,最整洁的解决方案,也已经在我的Cygwin上进行了测试,并且有一个续航能力。
–sundar-恢复莫妮卡
13年7月22日在17:32
只要确保执行此操作时您不在/ bin内,否则第一步将覆盖实际的chmod。
–马修·克鲁姆利
13年7月22日在17:57
+1安装。这么多解决方案。 :)
–frostschutz
13年7月23日在9:52
最佳解决方案,您需要知道的是cp不一定复制文件属性,它只能复制内容(但是您也可以告诉它也复制属性)。
– MichalH
15年8月8日在20:21
#5 楼
首先,我要从其他任何来源(网络书,cd等)引导,然后使用该来源上的chmod设置权限。编写一个微型C程序来更改权限。
编写一个perl脚本(红宝石,php,python等)来更改权限
/usr/bin/chmod
只是在进行系统调用以进行更改权限,您可以使系统以多种方式调用自己。#6 楼
这比其他任何答案都更hack(可能是
ld-linux.so
答案的例外,这是一个非常聪明的技巧),
但可能更适合其他问题
(尤其是如果您陷入时间漩涡
并回到Perl™之前的土地)。
为了安全起见,请将
/bin/chmod
复制到安全的地方:cd
cp /bin/chmod .
执行
echo chmod | cpio -oc > chmod.cpio
这将创建一个包含
cpio
的tar
归档文件(与chmod
归档文件不同)。 -c
选项指定文件元数据以十六进制形式编写(即,以ASCII形式)。vi chmod.cpio
您会看到类似的内容
0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
↑↑↑
后跟控制字符,标准ASCII字符,
和扩展ASCII字符的混合。请注意0644 = 0x1A4和0755 = 0x1ED。
找到
1A4
(从第20个字符位置开始),并将其更改为
1ED
。保存并退出。如果您使用的是十六进制编辑器或类似工具,
最好使用它来避免
vi
会污染仪器的风险。文件中的二进制可执行代码。 但是我用
vi
尝试了一下,它似乎可以正常工作。受保护的755。其他存档程序可能具有类似的功能。
尤其是
cpio -i < chmod.cpio
很旧,可能已过时; 如果没有,请寻找
chmod
。评论
这让我发笑,很好的小技巧
–sleepycal
2015年12月10日19:30在
#7 楼
甚至更简单-使用现代系统中经常出现的setfacl
:设置用户的可执行权限:
# setfacl -m u::rx /bin/chmod
现在使用现在的可执行二进制文件将其自身的权限设置回原始权限(即针对所有用户)。
# chmod +x /bin/chmod
删除扩展的ACL条目-可选,因为可能有充分的理由将它们放在首位。也可以在不支持ACL的文件系统上使用。
评论
这是一个很酷的技巧,但是您可能需要解释自己在做什么以及它是如何工作的。
–躲藏
15年1月27日在16:59
#8 楼
rsync
也可以用于更改文件的权限# rsync /bin/chmod /tmp/chmod --chmod=ugo+x
# ls -al /tmp/chmod
-rwxr-x--- 1 root root 52000 Sep 6 15:13 /tmp/chmod
#
#9 楼
将chmod的内容传送到已经可执行的文件中cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh
#10 楼
使用setfacl
:setfacl -m u::rwx /bin/chmod
/轻松方法;)
rpm -qf /bin/chmod # gets package name, coreutils
yum reinstall coreutils -y # :D
测试结果:
[root@h1 ~]# ll /bin/chmod
-rwxr-xr-x. 1 root root 58656 Mar 15 2019 /bin/chmod
[root@h1 ~]# chmod 444 /bin/chmod
[root@h1 ~]# ll /bin/chmod
-r--r--r--. 1 root root 58656 Mar 15 2019 /bin/chmod
[root@h1 ~]# yum reinstall coreutils
Loaded plugins: product-id, search-disabled-repos, subscription-manager
Resolving Dependencies
--> Running transaction check
---> Package coreutils.x86_64 0:8.22-24.el7 will be reinstalled
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================================================================================================================
Package Arch Version Repository Size
======================================================================================================================================================================================================
Reinstalling:
coreutils x86_64 8.22-24.el7 rhel-7-server-rpms 3.3 M
Transaction Summary
======================================================================================================================================================================================================
Reinstall 1 Package
Total download size: 3.3 M
Installed size: 14 M
Is this ok [y/d/N]: y
Downloading packages:
coreutils-8.22-24.el7.x86_64.rpm | 3.3 MB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : coreutils-8.22-24.el7.x86_64 1/1
Verifying : coreutils-8.22-24.el7.x86_64 1/1
Installed:
coreutils.x86_64 0:8.22-24.el7
Complete!
[root@h1 ~]# ll /bin/chmod
-rwxr-xr-x. 1 root root 58656 Mar 15 2019 /bin/chmod
[root@h1 ~]#
评论
由于此处提供的所有答案都是“正确答案”,因此我没有特别标记其中的任何一个。感谢所有回答的人,每个答案都以某种方式提供了教育。请注意,“如何在不重新启动的情况下执行此操作?”与“如何引导应急/安装媒体并解决此问题?”一样重要。我认为您需要同时做到这两项-有一天可能会节省工作。
ServerFault上也存在相同的问题(和类似的答案)。
@SpellingD谢谢。读那个线程很奇怪,就像这个问题的替代版本一样,只是答案略有不同。那里的人回答了他们以前在slideshare上看到的问题,有人评论了他们在Reddit上也看到的问题!
类似:如何在没有执行权限的情况下执行文件?在AskUbuntu