在 Linux 中以超級使用者身分執行「cd」命令

在 Linux 中以超級使用者身分執行「cd」命令

有沒有辦法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

答案3

完成我需要做的事情的最快方法是:

sudo -s

如中所述這個答案

相關內容