centos su无法自动完成用户名

时间:2018-11-01 07:56:10

标签: centos7

我的问题是在键入tab时用户名(不是很简单)不是自动完成的,在这里有任何方法可以解决此问题,或者只是给我一个调试建议。

ssh as user a
sudo -i
su z[tab]

关于系统和一些有用的信息,如下:

[root@VMS79253 ~]# cat /etc/system-release
CentOS Linux release 7.1.1503 (Core)
[root@VMS79253 ~]# rpm -qa| grep -i completion
bash-completion-2.1-6.el7.noarch
[root@VMS79253 ~]# cat /etc/passwd
...
zyxing:x:1005:1005::/home/zyxing:/bin/bash

[2018-11-21评论]
这个问题容易吗? 我刚刚尝试了以下操作,但不起作用。

  1. 确保我的帐户bash env是/ bin / bash(大多数人说选项卡将不起作用,因为bash env是/ bin / sh)
  2. 设置bash补全和源脚本(也有人说必须安装此插件和源脚本)
  3. 设置bash-completion-extras(extras插件正在centos7中进行测试)

1 个答案:

答案 0 :(得分:0)

编辑关注文件并重新登录后,问题已解决:
文件路径:/ usr / share / bash-completion / completions / su
更改42行,从

COMPREPLY=( $(compgen -f -- $cur) )

COMPREPLY=( $(compgen -u -- $cur) )


原因可能导致su无法自动完成用户名:

  • 首先,由于名为auto-complete的插件,因此在输入TAB时自动完成功能起作用
  • centos7和centos6之间有很多区别,因为centos7使用的自动完成插件的版本为2.x,而centos61.x。
    读取用于命令su的指定脚本后,我发现了一些奇怪的逻辑,整个脚本内容如下:


    1 _su_module()
    2 {
    3         local cur prev OPTS
    4         COMPREPLY=()
    5         cur="${COMP_WORDS[COMP_CWORD]}"
    6         prev="${COMP_WORDS[COMP_CWORD-1]}"
    7         case $prev in
    8                 '-'|'-u'|'--user')
    9                         COMPREPLY=( $(compgen -u -- $cur) )
    10                         return 0
    11                         ;;
    12                 '-g'|'--group'|'-G'|'--supp-group')
    13                         COMPREPLY=( $(compgen -g -- $cur) )
    14                         return 0
    15                         ;;
    16                 '-s'|'--shell')
    17                         COMPREPLY=( $(compgen -W "$(chsh -l)" -- $cur) )
    18                         return 0
    19                         ;;
    20                 '-h'|'--help'|'-V'|'--version')
    21                         return 0
    22                         ;;
    23         esac
    24         case $cur in
    25                 -*)
    26                         OPTS="  --user
    27                                 --preserve-environment
    28                                 --group
    29                                 --supp-group
    30                                 --login
    31                                 --command
    32                                 --session-command
    33                                 --fast
    34                                 --shell
    35                                 --help
    36                                 --version"
    37                         COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
    38                         return 0
    39                         ;;
    40         esac
    41         compopt -o filenames
    42         COMPREPLY=( $(compgen -f -- $cur) )
    43         return 0
    44 }
    45 complete -F _su_module su
    46 complete -F _su_module runuser

阅读此脚本很容易,并且我们知道如果键入su[space][TAB],则执行了第42行。
但是返回的是当前目录列表,而不是我们想要的用户列表。因此,我只是将这一行更改为列出用户并重新登录,问题已解决!