在 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 cdsudo 发挥作用,它本身必须是一个内置的 shell,并且需要某种方式来提升已运行进程的权限。目前 Linux 上不存在这样的机制(大多数其他操作系统上也没有)。


实现目标的一种方法是运行交互的具有 root 权限的 shell (任何方法都可以),然后使用cd其中的常规方法:

[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

正如所述这个答案

相关内容