完成后停止在 /root 目录中工作

maz*_*zda 5 debian bash tab-completion

如果我在根终端中su,那么一切都很好:完成在任何地方都可以。

如果作为普通用户,我尝试使用sudo访问/root/目录,例如,如果我想打开/root/.selected_editor.

当我达到 /ro 完成时,它仍然正常并写入/root/,但随后它停止工作。如果我写完想要手动执行的 Linux Bash 命令,那么这个命令就可以正常工作。

root@Xfce:~# cat .se(lected_editor) ---> completion is OK
xxx@Xfce:~$ sudo cat /ro(ot/)  --->  completion is still OK
xxx@Xfce:~$ sudo cat /root/.se(   ) --->  completion has stopped working
Run Code Online (Sandbox Code Playgroud)

为了看看我是否可以列出里面的内容/root/,我尝试了 sudo ls -a /root/,并且我得到了正确的列表。然后我在另一台安装了 Debian 11 的笔记本电脑上尝试,它的行为完全一样。

系统:配备Debian 11 (Bullseye) 和Xfce 的笔记本电脑

use*_*686 22

文件名的制表符补全不是通过要求“sudo cat”提供建议来完成的;它是由您当前正在输入命令的 shell 直接完成的。由于尚未在“sudo”下运行,因此它没有访问 的内容的权限/root,就像 als /rootecho /root/*不会一样。

请始终记住,这sudo不仅仅是一个特殊的 shell 关键字告诉它以 root 身份执行操作。它是一个完整的独立程序,需要以相同的方式运行ps或以其他方式运行。(例如,运行sudo cat something只会使 shell 运行 /bin/sudo;然后 sudo 获得 root 权限并运行实际的 /bin/cat。)

因此,它的效果仅在命令运行时可见,并且只能影响提供给 sudo 的命令行部分。它看不到“sudo this | that”中管道的其余部分(由 shell 分割),它不会影响文件重定向(这些重定向是在“sudo”运行之前由 shell 完成的),并且它可以不影响制表符完成(也由 shell 在启动“sudo”之前完成)。

(虽然对于某些命令,Bash 可能有自定义的“bash-completion”脚本,这些脚本可能会选择通过 sudo 运行一些帮助程序来获取文件或服务或进程的列表,但本示例中未使用此类脚本.您只处理 Bash 的内置文件名完成。)

  • 是的,这是一个很好的答案。 sudo 命令的另一个常见混淆是: `sudo /some/priviledged_directory/some_program > /some/priviledged_directory/outputfile` : > 部分是由当前 shell 完成的,因此可能是不可能的(因为当前 shell 的用户可能不会具有对该目录的写访问权限,甚至具有访问该目录的遍历权限),并且只有“some_program”命令是 sudo 的。 (2认同)