有没有办法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 上不存在这样的机制(大多数其他操作系统上也没有)。
实现目标的一种方法是运行交互的具有 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