在我们的大多数服务器上,以 root 身份输入服务命令后,服务名称的制表符补全功能不再起作用。以非 root 身份运行则一切正常。这是在 Ubuntu 12.04 上。我不确定如何解决此问题。
演示:
Tab 键补全的工作方式与普通用户相同zachary
,普通用户按下 Tab 键即可在第一张图片中列出补全:
但作为用户root
,它没有将服务列为完成(仅列出文件):
任何帮助将不胜感激。
答案1
在 Ubuntu 上此功能默认是禁用的。
阅读您的/root/.bashrc
:
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
#if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
# . /etc/bash_completion
#fi
Bash 补全是全部注释掉。显然其中有我不知道的原因(也许是恢复单用户模式?)。
当您执行 时它之所以能工作sudo su
,sudo -s
是sudo bash
因为它实际上并没有运行login
以使您完全成为 root。当运行sudo su -
或 时,sudo -i
它确实会完全以该用户身份登录。这里,以环境变量 为例$HOME
,进一步说明这种差异:
gert@gert-laptop:~$ id
uid=1000(gert) gid=1000(gert) groups=1000(gert),4(adm),7(lp),24(cdrom),27(sudo),[...]
gert@gert-laptop:~$ echo $HOME
/home/gert
gert@gert-laptop:~$ sudo -s
root@gert-laptop:~# id
uid=0(root) gid=0(root) groups=0(root)
root@gert-laptop:~# echo $HOME
/home/gert
root@gert-laptop:~# exit
gert@gert-laptop:~$ sudo su -
root@gert-laptop:~# id
uid=0(root) gid=0(root) groups=0(root)
root@gert-laptop:~# echo $HOME
/root
答案2
好的,我已经明白了,差不多。
有用的方法:
- sudo-i
- 须藤苏-
不起作用的事情:
- sudo -s
- 须藤苏
- sudo bash
因此在我看来,在前一种情况下,您实际上是在创建一个新的登录 shell,因此 bashrc、profile 等都可以从 ~ 或 /etc/skel 正确加载。在后一种情况下,您只是“以 root 身份执行 bash”,而实际上并没有将所有这些关键功能加载到 shell 中以实现自动完成等功能。
警告:我的解释可能完全错误。但上面的组确实有效。
答案3
sudo
您可以按照以下步骤在 bash 中完成:
- 打开你的
.bashrc
。 - 插入以下行并保存文件
if [ "$PS1" ]; then
complete -cf sudo
fi
该complete
命令为 sudo 生成命令名称 (-c
) 和文件名称 (-f
) 的补全列表。 - 打开一个新的 bash 并输入
sudo -s
Tab或您想要使用的任何其他命令。
答案4
我也遇到了同样的问题。我尝试了以下方法:
/usr/sbin/visudo
以 root 用户身份运行添加此行然后保存并退出:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
打开新会话并尝试立即运行命令
就是这样,你已经做到了。