恢復 Linux 中 Chmod 命令的可執行權限
我在 Twitter 上看到一個有趣的討論串。它是關於一個面試問題。問題是 - 如果 Chmod 指令的可執行權限不小心被移除了,你會怎麼做? 正如你所知,Chmod(代表 Change mode,更改模式)指令用於在類 Unix 系統中設定或更改檔案或目錄的存取權限。所以,如果 chmod 的可執行權限被移除,你將無法為任何程式分配權限,包括 chmod 指令本身。假設你正坐在面試考官面前,考官剛剛問了這個問題。那麼,你該如何在 Linux 中恢復 chmod 指令的可執行權限呢?
你可能會回覆說:「我會從其他系統複製 chmod 二進位檔?」好吧,你只有一個系統可以使用。所以你無法從其他系統複製 chmod 二進位檔。你可能會再次回覆說:「我會從 Perl 設定執行位元。」面試官說:「你的機器上沒有任何直譯器。」此外,也沒有網際網路或電話連線,因此你也無法聯繫任何人求助。在如此困難的情況下,你要如何恢復 chmod 指令的可執行權限呢?如果你已經知道答案,那就為你的智慧豎起大拇指。如果你像我一樣不是關鍵思考者,請繼續閱讀。
警告:請不要嘗試在生產系統中移除 chmod 命令的執行權限。請在虛擬機或測試機上嘗試。這僅用於教育目的。
如果你不小心移除了 Chmod 命令的可執行權限,你應該怎麼做?
假設你不小心執行了以下命令:
# chmod -x $(which chmod)在這裡,-x 標誌將移除給定程式的可執行權限。在我們的例子中,它是 chmod。
你非常好奇,而且你真的不知道這個命令會做什麼。現在你已經失去了 chmod 命令的可執行權限。沒有辦法再次恢復 chmod 的可執行權限。如果你嘗試使用以下命令設置權限:
# chmod +x $(which chmod)
你將會收到以下錯誤訊息:
bash: /usr/bin/chmod: Permission denied即使你登出並嘗試使用其他 sudo 用戶,也無法使用 chmod 命令分配權限:
$ sudo chmod +x $(which chmod)
sudo: chmod: command not found你如何將 chmod 權限恢復到原本的狀態?嗯,這比你想像的要簡單。
恢復 Linux 中 Chmod 命令的可執行權限
有幾種方法可以恢復對 chmod 的執行權限。在這裡,我提供了七種方法。
方法 1 - 將 chmod 二進位檔的內容複製到其他可運作的二進位檔
請記住,我們只移除了 chmod 命令的可執行權限,而不是其他命令的權限。對吧?沒錯!其他命令仍然有可執行權限。所以,我們可以通過將 chmod 命令的內容複製到任何其他可執行命令,例如 mkdir,並將 chmod 的可執行權限恢復到原來的狀態來解決這個問題。
在複製之前,讓我們使用以下命令對 mkdir 命令進行備份:
# cp /usr/bin/mkdir /usr/bin/mkdir.bak接下來使用「cat」命令將 /usr/bin/chmod 的內容複製到 /usr/chmod/mkdir :
# cat /usr/bin/chmod > /usr/bin/mkdir現在,mkdir 命令已經變成了 chmod 命令(因為我們將 chmod 的內容複製到了 mkdir 二進位檔)。
然後,使用指令恢復實際 chmod 二進位檔的可執行權限:
# mkdir +x /usr/bin/chmod
或者,您可以將 mkdir 的內容複製回 chmod 二進位檔:
# mv /usr/bin/mkdir /usr/bin/chmod最後,從備份還原原本的 mkdir 指令:
# mv /usr/bin/mkdir.bak /usr/bin/mkdir完成!我們已成功將執行權限恢復到 chmod 命令。
使用 ls 命令檢查可執行權限是否已恢復:
# ls -l /usr/bin/chmod或者,
# ls -l $(which chmod)
-r-xr-xr-x 1 root root 63864 May 27 07:16 /usr/bin/chmod注意上述輸出中的字母「x」。它表示執行權限。
你也可以透過使用 chmod 給其他程式分配可執行權限來驗證它,如下所示:
# chmod +x ostechnix.sh# ls -l
total 0
-rwxr-xr-x 1 root root 0 May 27 07:43 ostechnix.sh這是最簡單的方法,因為你不必記住任何東西。我們只是使用 cat 命令將 chmod 的內容複製到其他命令,然後恢復執行權限。
我在 Ubuntu 20.04 伺服器版進行了測試。在其他 Linux 發行版中,chmod 可執行檔可能位於 /bin/ 目錄下。您可以使用以下命令來查找 chmod 可執行檔的位置:
$ which chmod
不過,這並不是唯一的方法。我快速在 Google 搜尋了一下,找到了幾種其他方法。你可能需要記住以下指令。
方法 2 - 使用 cp 指令
這是另一種將可執行權限恢復到 chmod 的方法。
在這種方法中,我們使用「cp」命令來複製屬性:
# cp --attributes-only --preserve=mode /proc/self/exe /usr/bin/chmod方法 3 - 使用 GNU 連結器/載入器 (ld)
在這種方法中,你可以直接運行「ld」加載器,並像下面這樣傳遞你想運行的命令:
# /lib64/ld-linux-x86-64.so.2 /usr/bin/chmod +x /usr/bin/chmod如果你使用 32 位系統,指令將會是:
$ /lib/ld-linux.so /usr/bin/chmod +x /usr/bin/chmod載入程式的路徑可能會根據你使用的 Linux 發行版而有所不同。上述命令適用於 Ubuntu 及其衍生版本。在其他發行版中,路徑可能會不同:
# /lib/libc.musl-x86_64.so.1 /bin/chmod +x /bin/chmod方法 4 - 使用 setfacl
我們可以使用「setfacl」命令恢復 chmod 可執行權限。
首先,修改具有讀取和執行權限的用戶的 chmod 二進位檔案的 ACL:
# setfacl -m u::rx /usr/bin/chmod然後,將 chmod 權限恢復到原本的設定:
# chmod +x $(which chmod)最後,移除所有 chmod 的 ACL 條目。這是可選的。
# setfacl -b /usr/bin/chmod如果 setfacl 命令不可用,請安裝 "acl" 套件。例如,請執行以下命令在 Debian、Ubuntu 及其衍生版本上安裝 acl:
# apt install acl方法 5 - 使用 rsync
Rsync 不僅僅是用來在系統之間複製或備份檔案和目錄,它也可以用來分配檔案的權限。
首先,讓我們將 chmod 二進位檔案複製到 /tmp 位置,同時賦予所有人可執行權限,即使用者、群組和其他人:
# rsync /usr/bin/chmod /tmp/chmod --chmod=ugo+x接下來,檢查是否已將可執行權限指派給 chmod:
$ ls -l /tmp/chmod範例輸出:
-r-xr-xr-x 1 root root 63864 May 27 10:01 /tmp/chmod如果權限沒問題,只需用 /tmp/chmod 文件覆蓋原始文件即可:
# mv /tmp/chmod /usr/bin方法 6 - 使用 Busybox
一些近期的 Linux 發行版預設安裝了 "Busybox"。根據 Busybox 的手冊頁,
BusyBox 將許多常見的 UNIX 工具的簡化版本結合成一個小型執行檔。它為大多數通常可以在 GNU coreutils、util-linux 等中找到的工具提供了簡約的替代品。BusyBox 中的工具通常選項比它們功能完整的 GNU 工具少;然而,所包含的選項提供了預期的功能,並且行為非常像它們的 GNU 對應工具。
要使用 busybox 還原 Chmod 執行權限,請執行:
# busybox chmod +x /usr/bin/chmod方法7 - 使用 Perl
以防你的系統上有 Perl,你可以使用以下命令來修復 Chmod 的執行權限:
# perl -e 'chmod 0755, "/usr/bin/chmod"'結論
正如你所看到的,這是一個微不足道的問題,聰明的 Linux 使用者可以輕鬆解決。如果你是初學者或中級 Linux 使用者,你可能永遠無法解決。這類問題可能會被用來檢查面試者的臨場反應以及他如何跳出框架思考。多虧了前面提到的 Twitter 帖子,我今天學到了一些有用的知識。希望對你也有幫助。
相關閱讀:
- 如何在 Linux 中根據檔案權限查找檔案
- 如何同時複製文件並更改所有權和權限

