問題原因
我打算透過以下內容新增對「.hgignore」等隱藏檔案的群組寫入權限:
#密碼 /選擇 # sudo chmod -R g+w .*
問題是“..”與此模式匹配,現在整個 RHEL 檔案系統都設定了 g+w。眼前的問題如下:
- /etc/sudoers需要設定為440,而不是460,所以現在使用者無法使用sudo。
- 一些與上面類似的機制不允許 ssh 存取。 (遠端 ssh 用戶端收到訊息「ssh_exchange_identification:連線被遠端主機關閉」錯誤)
問題
為了重新獲得遠端登入的能力,需要指導能夠物理存取伺服器的人員如何修復系統。
現在的問題是:哪些重要的檔案和目錄需要恢復其權限才能恢復ssh
和sudo
功能?
關於「作為重複項關閉」的注意事項
問題為什麼「chmod -R 777 /」具有破壞性?詳細解釋了遞歸擴展權限可能產生的影響。這個問題旨在回答如何透過 ssh 重新獲得遠端存取權限,以便可以執行更廣泛的恢復和修復。
答案1
對於屬於套件一部分的文件,您可以透過執行以下操作找出搞砸的內容
rpm --驗證“包名”
其中 packagename 是單一套件,或者您可以循環遍歷「rpm -qa」的輸出
然後你應該能夠使用 rpm 來修復它們,例如
rpm --setperm "包名"
答案2
ssh 的問題不僅限於 /etc 下,還與您嘗試連接的使用者的 .ssh 資料夾具有不正確的權限有關。通常,使用者的 .ssh 資料夾應為 700,私鑰應為 600,其他所有內容都可以為 644。
/etc/ssh 資料夾應為 755,/etc/ssh 下的私鑰應為 600,其他所有內容應為 644。
如何從 /etc 中的錯誤權限恢復伺服器?
最簡單的方法之一可能是從備份中還原。您確實進行了備份並測試了復原過程,對嗎? :)
如果您沒有可用於還原的備份,則可能需要在虛擬機器中設定相同的乾淨系統,然後透過比較兩者來修復基於您的伺服器的主機上的權限。
答案3
如果您有一台已知良好的伺服器,則在該良好伺服器上運行類似以下內容可能會幫助您恢復它。 (假設遞歸通配能力(zsh),可以使用 find 和 -exec / xargs 來代替):
for i in /etc/**/*; do
perm=$(stat "$i" -c "%a")
ssh root@badServerHostName "chmod $perm $i"
done
可能是幾個子目錄,以排除其他可能添加的內容...如果可以的話,Rsync 會更好僅有的權限,但我不認為可以。
答案4
如果您有備份並且有 LVM 和足夠的空間,您可以執行以下操作:
1. 將備份還原到新的臨時 lv(將其安裝在 /oldperm 下)
2. 執行類似以下偽代碼的操作:
foreach oldfile in /oldperm/* {
newf = strip "/oldperm" from oldfile
chmod --reference=oldfile newf
}
您可以部分恢復,例如先恢復 /etc 下的所有內容,以防出現空間問題。這個技巧依賴 chmod 的標誌 --reference ,它將另一個檔案作為模板,並使參數在權限方面匹配。
這樣您只需恢復舊的權限而不更改檔案的內容。