linux CentOS 权限问题修复(chmod 777 -R 或者chmod 755 -R问题修复)
我个人曾经有一次经历:
就是在修改文件夹权限的时候,本来该执行:
#chmod 777 -R ./
结果我漏掉了那个".";执行的命令是chmod 777 -R /。 这个命令一定慎用,否则容易酿成大错。
结果就出大问题了。系统崩溃。
解决办法:
到正常的文件系统中获取一下权限列表。
#getfacl -R / > /tmp/acl.bak
解释下这条命令:getfacl就是获取权限列表命令,-R是遍历,/ 这个表示或者整个根目录权限。如果你单独某个目录有权限问题例如bin. 那这里可以换成 getfacl -R /bin > /tmp/acl.bak. ">" 这个符号就是写入 。后面是路径
上面那个做好之后把acl.bak拷贝到你现在的系统上;
执行:
#setfacl --restore acl.bak
然后就大功告成了。这个可以解决各种权限问题 。
chmod -R 777 的3种补救办法,附有linux chmod命令语法和结构详解
作者/来源:新睿云小编 发布时间:2019-12-05
有很多新手误操作 chmod -R 777,导致系统中的大部分服务以及命令无法正常使用。新睿云为大家整理了3种chmod -R 777的补救办法,还有linux chmod命令的详解。
chmod命令可以改变权限目录和文件权限,-R是目录下所有文件,777是高权限(读、写、执行),
chmod -R 777 意思就是将当前目录及目录下所有文件都给予777权限
这个在服务器里不能随便敲的,不能在根目录下进行此命令,因为有些进程是指定权限(如755、700...)才能运行的...所以会出错
一、chmod -R 777补救办法
1、chmod -R 777补救办法1——根目录执行chmod -R 777 / 的补救方法
ch /etc/
chmod 644 passwd group shadow
chmod 400 gshadow
cd ssh
chmod 600 moduli ssh_host_dsa_key ssh_host_key ssh_host_rsa_key
chmod 644 ssh_config ssh_host_dsa_key.pub ssh_host_key.pub ssh_host_rsa_key.pub
chmod 640 ssh_config
然后尝试使用ssh登录,正常。
如果使用普通用户登录,使用su - 切换root会出现以下错误:
root "su cannot set groups"
这是因为su必须有s权限才能预读取root的相关配置,需要使用如下命令:
chmod u+x `which su`
然后就可以进入系统了。
找一台干净的机器,把系统的权限导出,然后在导入本机
在干净的机器上执行:getfacl -R / > ./linux.chmod.bak
在本机上执行:setfacl --restore=/root/linux.chmod.bak
重启服务器使权限生效
2、chmod -R 777补救办法2——执行chmod -R 777 / 补救
执行后千万不要退出当前窗口!!!
在自己的虚拟机上设置某个站的权限的时候,原来应该是chmod -R 777 ./* 结果少按了个点,执行了chmod -R 777 /* 因为执行时间超出自己的预想范围赶紧按下CTRL+C,可惜晚了,看下了/etc目录下的东西,全部都是777状态,立马开另一个终端尝试登陆,已经登录不上了!
原先执行的窗口还可以操作,于是找资料看看有没有解决方法,要是在机房生产机犯这样低级的错误,总不能重装吧。linux没这么脆弱。
ssh登录不上,应该跟passwd、group、shadow、ssh这几个文件扯上关系而已,开了另一台linux查看权限,并在错误的机器上修改成对应的权限:
cd /etc
chmod 644 passwd group shadow
chmod 400 gshadow
cd ssh
chmod 600 moduli ssh_host_dsa_key ssh_host_key ssh_host_rsa_key
chmod 644 ssh_config ssh_host_dsa_key.pub ssh_host_key.pub ssh_host_rsa_key.pub
chmod 640 sshd_config
chmod 700 /var/empty/sshd
然后尝试ssh登录,ok正常,不过没办法切换成root用户
su -
root “su: cannot set groups: "
因为su必须有s权限才能预读取root的相关配置:
chmod u+s `which su`
完成之后就可以进去系统慢慢折腾了。
找一台linux系统(尽量越干净越好),把系统的权限导出,然后再导入到本机。
在好的机器上执行
getfacl -R / > ./linux.chmod.bak
然后通过ftp或者rz命令上传到要修复的机子上
执行:
setfacl --restore=/root/linux.chmod.bak
执行这个后需要重启机器才会替换权限(真够麻烦,要是线上机器怎么可以随便重启,实际上这个时候机器是可以正常访问,只是安全方面没保证)
执行前,写个脚本让它在开机后执行,万一替换的脚本有问题,至少还能登录ssh。没错,就是把上面的命令写成脚本放在放在rc.local里面延迟执行。我放在/root/下
cat sshtmp.sh
#----------start----------
#!/bin/bash
sleep 300
cd /etc
chmod 644 passwd group shadow
chmod 400 gshadow
cd ssh
chmod 600 moduli ssh_host_dsa_key ssh_host_key ssh_host_rsa_key
chmod 644 ssh_config ssh_host_dsa_key.pub ssh_host_key.pub ssh_host_rsa_key.pub
chmod 640 sshd_config
chmod 700 /var/empty/sshd
chmod u+s `which su`
#-----------------end----------
放到开机启动
echo ‘/root/sh/sshtmp.sh &‘ >>/etc/rc.local
然后reboot 吧。
重启后如果能正常登录系统,可以先把sshtmp.sh 的进程kill掉,并去掉/etc/rc.local里面脚本。然后查看权限有没有正常。
3、chmod -R 777补救办法3——Ubuntu 执行chmod -R 777 / 挽救方法
怎么会有堪比rm -rf /*这样神奇的命令,本想着把当前目录下的权限改为777,没想到把整个/目录下全设成777了,直觉告诉我好像哪里有些不对劲,好在一顿折腾最终弄好了,应该没啥大问题,嗯目前是这样,能够正常使用。
具体做法就是拿一个启动盘(不是重装系统,虽然重装是网上大多数的建议,我当时也差点重装,不过抱着侥幸的心理试了试结果就好了),进入启动盘点击Try Ubuntu然后进入界面,打开Terminal,一般会自动挂载物理机上所有的分区,找到损坏系统的/目录然后再终端打开(昨天光顾着修复了,也没留个图做个纪念),然后使用Sudo chmod ...命令将/下所有的目录改为正常系统的权限,巧的是我有一台云服务器(不过不是Ubuntu,是Centos,当时也抱着死马当活马医的心态),并且服务器上也装了可道云(免费版,当然也可以用命令行),按照图中显示的权限,一个一个改就行了,然后我还将/etc/ssh里的文件按照正常系统的权限改了下。
还执行过这两个命令:
cd /etc
chmod 644 passwd group shadow
chmod 400 gshadow
其他的就没什么问题了,然后重启就能正常开机了(万幸),其他问题就可以问度娘解决了(反正都能正常进入系统了,其他都不是啥大问题),当然我这方法也不保证能够通用,只是将我的经验分享一下,万一能帮助有需要的你呢。
二、linux chmod命令的详解
chmod是一个计算机函数,功能是改变文件的读写许可设置,如果改变成功返回0,否则返回-1,函数原型是int chmod( const char *filename, int pmode );。
1、Linux chmod命令基础解释
chmod命令是linux上用于改变权限的命令,用于变更文件或目录的权限。通过修改文件或目录权限可以让指定的人对文件可读、可写、可运行,极大地保证了数据的安全性。在UNIX系统家族里,文件或目录权限的控制分别以读取,写入,执行3种一般权限来区分,另有3种特殊权限可供运用,再搭配拥有者与所属群组管理权限范围。您可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果您对符号连接修改权限,其改变会作用在被连接的原始文件。
①权限范围的表示法如下:
u:User,即文件或目录的拥有者。
g:Group,即文件或目录的所属群组。
o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。
a:All,即全部的用户,包含拥有者,所属群组以及其他用户。
②有关权限代号的部分,列表于下:
r:读取权限,数字代号为"4"。
w:写入权限,数字代号为"2"。
x:执行或切换权限,数字代号为"1"。
-:不具任何权限,数字代号为"0"。
s:当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限。
③语法:
chmod [-cfRv][--help][--version][<权限范围>+/-/=<权限设置...>][文件或目录...]
chmod [-cfRv][--help][--version][数字代号][文件或目录...]
chmod [-cfRv][--help][--reference=<参考文件或目录>][--version][文件或目录...]
④选项说明:
-c或--changes 效果类似"-v"参数,但仅回报更改的部分。
-f或--quiet或--silent 不显示错误信息。
-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-v或--verbose 显示指令执行过程。
--help 在线帮助。
--reference=<参考文件或目录> 把指定文件或目录的权限全部设成和参考文件或目录的权限相同
--version 显示版本信息。
<权限范围>+<权限设置> 开启权限范围的文件或目录的该项权限设置。
<权限范围>-<权限设置> 关闭权限范围的文件或目录的该项权限设置。
<权限范围>=<权限设置> 指定权限范围的文件或目录的该项权限设置。
2、Linux chmod命令的常用语法
命令名称: chmod
执行权限: 所有用户
功能描述: 改变文件或目录权限
语法: 第一种方法 chmod [{ugoa}{+-=}{rwx}] [文件或目录]
备注: u:所有者 g:所属组 o:其他人 a:所有人
+:为用户增加权限 -:为用户减少权限 =:为用户赋予权限
r:读权限 w:写权限 x:执行权限
语法:第二种方法 chmod -R [mode=421] [文件或目录]←(这种方法用的比较多)
备注:
r 代表读,w 代表写,x 代表执行,
如果可读,权限是二进制的100,十进制是4;
如果可写,权限是二进制的010,十进制是2;
如果可运行,权限是二进制的001,十进制是1;
-R 递归修改(就是将嵌套在很多文件夹中的文件权限修改了,如果没有这个,只能到指定的文 件夹下进行修改)
具备多个权限,就把相应的 4、2、1 相加就可以了:
若要 rwx 则 4+2+1=7
若要 rw- 则 4+2=6
若要 r-x 则 4+1=5
若要 r-- 则 =4
若要 -wx 则 2+1=3
若要 -w- 则 =2
若要 --x 则 =1
若要 --- 则 =0
范例: chmod 777 /etc/xinruiyun 将xinruiyun这个文件夹权限改为对所有用户可读,可写,可执行
chmod 775 /etc/zhishiku 将zhishiku这个文件夹权限改为其他用户不可读
3、linux chmod命令结构详解
在Linux中输入ll,会出现指定目录下文件/目录的详细信息,本文重点讲解权限部分,也就是下图中红色框中的部分。
chmod命令结构的10个字符
详解下图:权限一共是10个字符,第1个字符分为1组,后面9个字符分为3组。
第1个字符有两种情况:如果是“d”则代表这是一个文件夹,如果是“—”代表这是一个文件;
第2、3、4个字符:这3个字符共同代表的是文件的拥有者,可以用u来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限;
第5、6、7个字符:这3个字符代表的是文件所属群组,可以用g来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限;
第8、9、10个字符:这3个字符代表的是除拥有者和所属群组之外的其他所有的用户,可以用o来表示,拥有四个权限:r:读权限 , w:写权限,x:执行权限,—:无权限。
注意:后面9个字符除了u,g,o外,还有一个a,代表了所有用户。
chmod命令结构详解