我個人曾經有一次經歷:
就是在修改文件夾權限的時候,本來該執行:
#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命令結構詳解