
有沒有辦法cd
以超級使用者權限執行指令來存取 root 擁有的目錄?當我跑步時sudo cd <path>
,我得到了sudo: cd: command not found
。
答案1
另一個答案並沒有錯。
可能更好的答案是:
sudo 工具旨在以超級使用者身分執行操作,而您所描述的內容更多的是狀態更改,該狀態變更將在「ls」或「vi」等操作之前進行,以使它們更簡單。
我建議,例如,如果您想編輯 /root/private/ 中的檔案:
sudo ls /root
sudo ls /root/private
sudoedit /root/private/<name from previous ls command>
這肯定需要更多的打字,並且比僅僅更改目錄要困難一些。然而,它是遠的與運行“sudo bash”的某些變體相比,更易於審計,並且更符合 sudo 背後的原則。
如果您在安全的環境中工作,您的 IA 團隊將會感謝您。如果你發現自己想知道:「前幾天我做了什麼改變?」那麼你會感謝您,因為您不必想知道您編輯了哪些文件。
綜上所述,啟用和執行某種形式的“sudo bash”肯定更容易。如果您想要更簡單,為什麼首先使用“sudo”而不是僅以 root 身份登入?
答案2
正如您所指出的,cd
是一個 shell 內建命令,並且這是有原因的為此:「目前目錄」是每個進程的參數,只能由進程更改本身。
您的 shell 的工作目錄不能被任何子程序更改 - 因此,即使您設法cd
在特權子 shell 中運行,它也只會更改該臨時子 shell 的工作目錄,並且無論您使用什麼方法來提升特權。
因此,為了sudo cd
工作,sudo 本身必須是內建的 shell,並且需要某種方法來提升已執行進程的權限。目前 Linux(以及大多數其他作業系統)上並沒有這樣的機制。
實現您想要的目標的一種方法是運行互動的cd
具有root權限的shell(任何方法都可以),只需在其中使用常規:
[user@host /]$ sudo bash
[root@host /]# cd /root/secret
如果您想在一個命令中完成所有操作,則必須如下所示 - 首先更改工作目錄,然後啟動互動式 shell:
sudo bash -c "cd /root/secret && bash"
su -c "cd /root/secret && zsh"
注意:外部指令不必是 shell,它只需要是某物更改其工作目錄並執行新命令。最近的 Linux 系統有一兩個可以使用的助手:
sudo nsenter --wd="/root/secret" bash # util-linux v2.23 (debian jessie)
sudo env --chdir="/root/secret" bash # coreutils v8.28 (debian buster)
這種方法的優點是不需要巢狀引用;您可以執行多字命令,而不會遇到空格或特殊字元的問題。
最後,一些程式有一個內建選項來更改其工作目錄:
sudo make -C /etc
sudo git -C /root/secret log