“sudo cd ...”单行?

j-g*_*tus 20 command-line sudo

有时我想cd进入我的用户没有权限的目录,所以我求助于sudo.

明显的命令sudo cd somedir不起作用:

$ sudo mkdir test
$ sudo chmod go-rxw test
$ ls -l
drwx------ 2 root     root  [...snip...] test
$ cd test
-bash: cd: test: Permission denied
$ sudo cd test
sudo: cd: command not found
Run Code Online (Sandbox Code Playgroud)

使用sudo su作品:

$ sudo su
# cd test
Run Code Online (Sandbox Code Playgroud)

有可能把它做成单线吗?(没什么大不了的,只是无聊的好奇心:)

我尝试的变体不起作用:

$ sudo "cd test"
sudo: cd: command not found
$ sudo -i cd test
-bash: line 0: cd: test: No such file or directory
$ sudo -s cd test
Run Code Online (Sandbox Code Playgroud)

最后一个没有给出错误,但它 cd 在一个新的 shell 中,该 shell 在行尾退出,所以它实际上并没有带我去任何地方。

有人可以启发我为什么会发生这种情况吗?为什么sudo cd找不到,例如当sudo ls ...工作正常时?

小智 20

从理论上讲,问题在于如果您没有目录的执行权限,您应该无法读取目录的内容。现在假设你可以做你想做的事:

user@desktop:/$ sudo cd restricted-dir
user@desktop:/restricted-dir$ ls
file1 file2
Run Code Online (Sandbox Code Playgroud)

如您所见,您使用 sudo 权限进入了目录,然后,当 sudo 返回时,您再次成为用户,并且您位于通常不应该进入的目录中。

从技术上讲,问题如下。

sudo cd restricted-dir
Run Code Online (Sandbox Code Playgroud)

cd 是一个内置的shell,而不是一个命令。

sudo cd -i restricted-dir
Run Code Online (Sandbox Code Playgroud)

您可能在 /root 中,但它会遇到与下一个相同的问题。

sudo cd -s restricted-dir
Run Code Online (Sandbox Code Playgroud)

您打开一个新的 root shell,cd 进入目录,然后退出 root shell,并返回到您开始的地方。

总而言之,唯一的解决方案是打开一个 root shell 并在您在该目录中时将其保持打开状态。


Tag*_*gar 5

sudo sh -c "cd restricted-dir; some-other-command"
Run Code Online (Sandbox Code Playgroud)

IE

sudo sh -c "cd /root/restricted-dir; ls -l"
Run Code Online (Sandbox Code Playgroud)

关键部分是“sh -c”,我经常使用它在同一个 shell 上下文/进程中运行一系列命令。