在 Linux 中以超级用户身份运行“cd”命令

the*_*uru 9 linux cd sudo working-directory

有没有办法以cd超级用户权限运行命令来访问 root 拥有的目录?当我跑步时sudo cd <path>,我得到了sudo: cd: command not found

use*_*686 23

正如您所指出的,cd是 shell 内置命令,这是有原因的:“当前目录”是每个进程的参数,只能由进程本身更改。

任何子进程都无法更改您的 shell 的工作目录——因此,即使您设法cd在特权子 shell 中运行,它也只会更改该临时子 shell 的工作目录,并且您使用的提升特权的方法无关紧要。

所以为了sudo cd工作,sudo 本身必须是一个内置的 shell,它需要一些方法来提高已经运行的进程的权限。目前,Linux 上不存在这种机制(大多数其他操作系统也不存在)。


实现您想要的一种方法是运行具有 root 权限的交互式shell(任何方法都有效),然后只使用其中的常规cd

[user@host /]$ sudo bash
[root@host /]# cd /root/secret
Run Code Online (Sandbox Code Playgroud)

如果您想在一个命令中完成所有操作,它必须如下所示——首先更改工作目录,然后启动一个交互式 shell:

sudo bash -c "cd /root/secret && bash"
Run Code Online (Sandbox Code Playgroud)
su -c "cd /root/secret && zsh"
Run Code Online (Sandbox Code Playgroud)

注:外部命令没有成为一个壳,它只是需要一些改变它的工作目录并执行新的命令。最近的 Linux 系统有一个或两个可以使用的帮助程序:

sudo nsenter --wd="/root/secret" bash       # util-linux v2.23 (debian jessie)
Run Code Online (Sandbox Code Playgroud)
sudo env --chdir="/root/secret" bash        # coreutils v8.28 (debian buster)
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是不需要嵌套引用;您可以运行多字命令而不会遇到空格或特殊字符的问题。

最后,一些程序有一个内置选项来改变它们的工作目录:

sudo make -C /etc
Run Code Online (Sandbox Code Playgroud)
sudo git -C /root/secret log
Run Code Online (Sandbox Code Playgroud)


Sla*_*ast 22

另一个答案没有错。

可能更好的答案是:

sudo 工具旨在以超级用户的身份执行操作,并且您描述的内容更多是状态更改,该更改将在诸如 'ls' 或 'vi' 或其他操作之前进行,以使它们更简单。

我建议,例如,如果您想编辑 /root/private/ 中的文件:

sudo ls /root
sudo ls /root/private
sudoedit /root/private/<name from previous ls command>
Run Code Online (Sandbox Code Playgroud)

这肯定是更多的打字,而且比仅仅改变目录要困难一些。但是,它是远远更加审计能力,并在网上与比运行的一些变种须藤背后的原则更“sudo的庆典。”

如果您在安全的环境中工作,您的 IA 团队会感谢您。如果您发现自己想知道:“前几天我做了什么更改?”,那么会感谢您,因为您不必想知道您编辑了什么文件。

综上所述,启用和执行某种形式的“sudo bash”肯定更容易。如果您正在寻找更简单的方法,为什么首先使用“sudo”而不是仅以 root 用户身份登录?

  • 令人讨厌的事情是,如果非 root 用户没有对该目录的读取访问权限,则最后一个命令中文件名的制表符完成将不起作用。所以你必须复制粘贴或手动输入。我想知道是否有人会为 Bash 创建一个使用 `sudo` 的完成脚本。 (5认同)