thecomputerguru Asked: 2019-10-21 07:16:43 +0800 CST2019-10-21 07:16:43 +0800 CST 2019-10-21 07:16:43 +0800 CST 在 Linux 中以超级用户身份运行“cd”命令 772 有没有办法以cd超级用户权限运行命令以获得对 root 拥有的目录的访问权限?当我跑步时sudo cd <path>,我得到了sudo: cd: command not found。 linux sudo 4 个回答 Voted user1686 2019-10-21T08:19:03+08:002019-10-21T08:19:03+08:00 如您所述,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 Best Answer Slartibartfast 2019-10-21T09:21:18+08:002019-10-21T09:21:18+08:00 另一个答案没有错。 可能更好的答案是: 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 身份登录? orangecaterpillar 2019-12-11T10:36:24+08:002019-12-11T10:36:24+08:00 做我需要做的最快的方法是: sudo -s 如本答案所述。 Giacomo1968 2019-10-21T07:25:58+08:002019-10-21T07:25:58+08:00 当然,只需这样做: sudo $SHELL -c "cd <path>" 关键是-c运行之后引用的命令的选项-c。
如您所述,
cd
它是一个 shell 内置命令,这是有原因的:“当前目录”是每个进程的参数,只能由进程本身更改。你的 shell 的工作目录不能被任何子进程改变——所以即使你设法
cd
在一个特权子 shell 中运行,它也只会改变那个临时子 shell 的工作目录,你使用什么提升权限的方法都没有关系。因此,
sudo cd
为了工作,sudo 本身必须是一个内置的 shell,并且它需要一些方法来提高已经运行的进程的权限。目前在 Linux(也没有大多数其他操作系统)上不存在这样的机制。实现您想要的一种方法是运行具有 root 权限的交互式shell(任何方法都可以),并在
cd
其中使用常规:如果你想在一个命令中完成所有操作,它必须看起来像这样——首先更改工作目录,然后启动一个交互式 shell:
注意:外部命令不必是 shell,它只需要更改其工作目录并执行新命令即可。最近的 Linux 系统有一个或两个可以使用的助手:
这种方法的优点是它不需要嵌套引用;您可以运行多字命令,而不会遇到空格或特殊字符的问题。
最后,一些程序有一个内置的选项来改变他们的工作目录:
另一个答案没有错。
可能更好的答案是:
sudo 工具旨在以超级用户身份执行操作,而您所描述的更多是状态更改,该更改将在诸如“ls”或“vi”之类的操作或其他操作之前使它们更简单。
我建议,例如,如果您想编辑 /root/private/ 中的文件:
这绝对是更多的输入,并且比仅仅更改目录更难。但是,与运行“sudo bash”的某些变体相比,它更易于审计,并且更符合 sudo 背后的原则。
如果您在安全的环境中工作,您的 IA 团队会感谢您。如果您发现自己想知道:“前几天我做了什么更改?”那么您会感谢您,因为您不必想知道您编辑了哪些文件。
综上所述,启用和执行某种形式的“sudo bash”肯定更容易。如果您正在寻找更简单的方法,为什么首先使用“sudo”而不是仅以 root 身份登录?
做我需要做的最快的方法是:
如本答案所述。
当然,只需这样做:
关键是
-c
运行之后引用的命令的选项-c
。