ipset bash auto complete error on ubuntu 18.04

Bug #1828707 reported by ChengChung
18
This bug affects 3 people
Affects Status Importance Assigned to Milestone
ipset (Ubuntu)
Expired
Low
Unassigned

Bug Description

I have tested it on a brand new Ubuntu 18.04 amd64 system, then install the ipset package
when I type "ipset " and press tab to trigger bash auto completion,
it returns "-bash: syntax error near unexpected token `;;'".

ipset version: ipset v6.34, protocol version: 6

here is the full log, and I can see it fail when excuting eval _ipset_known_hosts()

+ local cur prev cword words ips_version
+ local str_action str_setname str_type str_filename
+ local str_glob str_regex str_prefix str_suffix
+ local str_tmp= str_var=
+ local str_timeout=timeout 'str_order=before after' str_forceadd=
+ local str_counters= str_bp_counters= str_comment= str_markmask=
+ local str_skbinfo= str_skbflags=
+ local -i i=x=y=0
+ local -i got_bashcompl=got_action=action_index=order_index=set_has_timeout=0
+ local -i got_bp_proto=0
+ local -i ignore_errors=use_file=names_only=headers_only=save_format=res_sort=0
+ arr_sets=()
+ arr_types=()
+ arr_members=()
+ arr_unknown_opts=()
+ local arr_sets arr_types arr_members arr_unknown_opts
+ arr_dupe_cmd_opts=()
+ arr_used_opts=()
+ arr_tmp=()
+ local arr_dupe_cmd_opts arr_used_opts arr_tmp
+ arr_opts=("-! -exist" "-o -output" "-q -quiet" "-r -resolve" "-s -sorted" "-n -name" "-t -terse" "-f -file")
+ local arr_opts
+ arr_icmp_types=(echo-reply pong network-unreachable host-unreachable protocol- unreachable port-unreachable fragmentation-needed source-route-failed network-un known host-unknown network-prohibited host-prohibited TOS-network-unreachable TO S-host-unreachable communication-prohibited host-precedence-violation precedence -cutoff source-quench network-redirect host-redirect TOS-network-redirect TOS-ho st-redirect echo-request ping router-advertisement router-solicitation ttl-zero- during-transit ttl-zero-during-reassembly ip-header-bad required-option-missing timestamp-request timestamp-reply address-mask-request address-mask-reply)
+ local arr_icmp_types
+ arr_icmp6_types=(no-route communication-prohibited address-unreachable port-un reachable packet-too-big ttl-zero-during-transit ttl-zero-during-reassembly bad- header unknown-header-type unknown-option echo-request ping echo-reply pong rout er-solicitation router-advertisement neighbour-solicitation neigbour-solicitatio n neighbour-advertisement neigbour-advertisement redirect)
+ local arr_icmp6_types
+ (( 4 < 4 ))
+ COMPREPLY=()
++ ipset version
+ ips_version='ipset v6.34, protocol version: 6'
+ ips_version='6.34, protocol version: 6'
+ ips_version=6.34
+ read -a ips_version
+ [[ 6 = +([[:digit:]]) ]]
+ (( ips_version[0] < 6 ))
+ (( ips_version[0] > 6 ))
+ (( ips_version[0] == 6 ))
+ (( ips_version[1] >= 22 ))
+ str_comment=comment
+ str_markmask=markmask
+ str_forceadd=forceadd
+ str_skbinfo=skbinfo
+ str_skbflags='skbmark skbprio skbqueue'
+ got_bp_proto=1
+ declare -f _get_comp_words_by_ref
+ got_bashcompl=1
+ _get_comp_words_by_ref -n : cur prev cword words
+ local exclude flag i OPTIND=1
+ words=()
+ local cur cword words
+ upargs=()
+ upvars=()
+ local upargs upvars vcur vcword vprev vwords
+ getopts c:i:n:p:w: flag -n : cur prev cword words
+ case $flag in
+ exclude=:
+ getopts c:i:n:p:w: flag -n : cur prev cword words
+ [[ 6 -ge 3 ]]
+ case ${!OPTIND} in
+ vcur=cur
+ let 'OPTIND += 1'
+ [[ 6 -ge 4 ]]
+ case ${!OPTIND} in
+ vprev=prev
+ let 'OPTIND += 1'
+ [[ 6 -ge 5 ]]
+ case ${!OPTIND} in
+ vcword=cword
+ let 'OPTIND += 1'
+ [[ 6 -ge 6 ]]
+ case ${!OPTIND} in
+ vwords=words
+ let 'OPTIND += 1'
+ [[ 6 -ge 7 ]]
+ __get_cword_at_cursor_by_ref : words cword cur
+ words=()
+ local cword words
+ __reassemble_comp_words_by_ref : words cword
+ local exclude i j line ref
+ [[ -n : ]]
+ exclude=:
+ printf -v cword %s 1
+ [[ -n : ]]
+ line='ipset '
+ (( i=0, j=0 ))
+ (( i < 2 ))
+ [[ 0 -gt 0 ]]
+ ref='words[0]'
+ printf -v 'words[0]' %s ipset
+ line=' '
+ [[ 0 == 1 ]]
+ (( i++, j++ ))
+ (( i < 2 ))
+ [[ 1 -gt 0 ]]
+ [[ '' == +([:]) ]]
+ ref='words[1]'
+ printf -v 'words[1]' %s ''
+ line=' '
+ [[ 1 == 1 ]]
+ printf -v cword %s 1
+ (( i++, j++ ))
+ (( i < 2 ))
+ [[ 2 == 1 ]]
+ local i cur index=6 'lead=ipset '
+ [[ 6 -gt 0 ]]
+ [[ -n ipset ]]
+ [[ -n ipset ]]
+ cur='ipset '
+ (( i = 0 ))
+ (( i <= cword ))
+ [[ 6 -ge 5 ]]
+ [[ ipset != \i\p\s\e\t ]]
+ [[ 0 -lt 1 ]]
+ local old_size=6
+ cur=' '
+ local new_size=1
+ index=1
+ (( ++i ))
+ (( i <= cword ))
+ [[ 1 -ge 0 ]]
+ [[ '' != '' ]]
+ [[ 1 -lt 1 ]]
+ (( ++i ))
+ (( i <= cword ))
+ [[ -n ]]
+ [[ ! -n '' ]]
+ cur=
+ [[ 1 -lt 0 ]]
+ local words cword cur
+ _upvars -a2 words ipset '' -v cword 1 -v cur ''
+ (( 10 ))
+ (( 10 ))
+ case $1 in
+ [[ -n 2 ]]
+ printf %d 2
+ [[ -n words ]]
+ unset -v words
+ eval 'words=("${@:3:2}")'
++ words=("${@:3:2}")
+ shift 4
+ (( 6 ))
+ case $1 in
+ [[ -n cword ]]
+ unset -v cword
+ eval 'cword="$3"'
++ cword=1
+ shift 3
+ (( 3 ))
+ case $1 in
+ [[ -n cur ]]
+ unset -v cur
+ eval 'cur="$3"'
++ cur=
+ shift 3
+ (( 0 ))
+ [[ -n cur ]]
+ upvars+=("$vcur")
+ upargs+=(-v $vcur "$cur")
+ [[ -n cword ]]
+ upvars+=("$vcword")
+ upargs+=(-v $vcword "$cword")
+ [[ -n prev ]]
+ [[ 1 -ge 1 ]]
+ upvars+=("$vprev")
+ upargs+=(-v $vprev "${words[cword - 1]}")
+ [[ -n words ]]
+ upvars+=("$vwords")
+ upargs+=(-a${#words[@]} $vwords "${words[@]}")
+ (( 4 ))
+ local cur cword prev words
+ _upvars -v cur '' -v cword 1 -v prev ipset -a2 words ipset ''
+ (( 13 ))
+ (( 13 ))
+ case $1 in
+ [[ -n cur ]]
+ unset -v cur
+ eval 'cur="$3"'
++ cur=
+ shift 3
+ (( 10 ))
+ case $1 in
+ [[ -n cword ]]
+ unset -v cword
+ eval 'cword="$3"'
++ cword=1
+ shift 3
+ (( 7 ))
+ case $1 in
+ [[ -n prev ]]
+ unset -v prev
+ eval 'prev="$3"'
++ prev=ipset
+ shift 3
+ (( 4 ))
+ case $1 in
+ [[ -n 2 ]]
+ printf %d 2
+ [[ -n words ]]
+ unset -v words
+ eval 'words=("${@:3:2}")'
++ words=("${@:3:2}")
+ shift 4
+ (( 0 ))
+ (( got_bashcompl ))
+ declare -F _ipset_known_hosts
++ grep --color=auto -Ev '^(\{|\})'
++ grep --color=auto -Ev '^_known_hosts_real.*$'
++ grep --color=auto -v __ltrim_colon_completions
++ declare -f _known_hosts_real
+ eval '_ipset_known_hosts() { ' local configfile flag 'prefix;' local cur curd awkcur user suffix aliases i host ipv4 'ipv6;' local -a kh khd 'config;' local ' OPTIND=1;' while getopts '"ac46F:p:"' flag '"$@";' do case '$flag' in 'a)' 'alia ses='\''yes'\''' ';;' 'c)' 'suffix='\'':'\''' ';;' 'F)' 'configfile=$OPTARG' ';; ' 'p)' 'prefix=$OPTARG' ';;' '4)' ipv4=1 ';;' '6)' ipv6=1 ';;' 'esac;' 'done;' ' [[' '$#' -lt '$OPTIND' ']]' '&&' echo '"error:' '$FUNCNAME:' missing mandatory a rgument 'CWORD";' 'cur=${!OPTIND};' let '"OPTIND' += '1";' '[[' '$#' -ge '$OPTIN D' ']]' '&&' echo '"error:' '$FUNCNAME("$@"):' unprocessed 'arguments:"' '$(whil e' '[[' '$#' -ge '$OPTIND' ']];' do printf ''\''%s\n'\''' '${!OPTIND};' 'shift;' 'done);' '[[' '$cur' == '*@*' ']]' '&&' 'user=${cur%@*}@' '&&' 'cur=${cur#*@};' 'kh=();' if '[[' -n '$configfile' ']];' then '[[' -r '$configfile' ']]' '&&' 'c onfig+=("$configfile");' else for i in /etc/ssh/ssh_config '~/.ssh/config' '~/.s sh2/config;' do '[[' -r '$i' ']]' '&&' 'config+=("$i");' 'done;' 'fi;' for i in '"${config[@]}";' do _included_ssh_config_files '"$i";' 'done;' if '[[' '${#conf ig[@]}' -gt 0 ']];' then local 'OIFS=$IFS' 'IFS='\''' \' 'j;' local -a 'tmpkh;' 'tmpkh=($(' awk ''\''sub("^[' '\t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[K k][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][' '\t]+",' '"")' '{' prin t '$0' '}'\''' '"${config[@]}"' '|' sort -u '));' 'IFS=$OIFS;' for i in '"${tmpk h[@]}";' do while '[[' '$i' '=~' '^([^\"]*)\"([^\"]*)\"(.*)$' ']];' do 'i=${BASH _REMATCH[1]}${BASH_REMATCH[3]};' 'j=${BASH_REMATCH[2]};' __expand_tilde_by_ref ' j;' '[[' -r '$j' ']]' '&&' 'kh+=("$j");' 'done;' for j in '$i;' do __expand_tild e_by_ref 'j;' '[[' -r '$j' ']]' '&&' 'kh+=("$j");' 'done;' 'done;' 'fi;' if '[[' -z '$configfile' ']];' then for i in /etc/ssh/ssh_known_hosts /etc/ssh/ssh_know n_hosts2 /etc/known_hosts /etc/known_hosts2 '~/.ssh/known_hosts' '~/.ssh/known_h osts2;' do '[[' -r '$i' ']]' '&&' 'kh+=("$i");' 'done;' for i in /etc/ssh2/known hosts '~/.ssh2/hostkeys;' do '[[' -d '$i' ']]' '&&' 'khd+=("$i"/*pub);' 'done;' 'fi;' if '[[' '${#kh[@]}' -gt 0 '||' '${#khd[@]}' -gt 0 ']];' then 'awkcur=${cur //\//\\\/};' 'awkcur=${awkcur//\./\\\.};' 'curd=$awkcur;' if '[[' '"$awkcur"' == '[0-9]*[.:]*' ']];' then 'awkcur="^$awkcur[.:]*";' else if '[[' '"$awkcur"' == '[0-9]*' ']];' then 'awkcur="^$awkcur.*[.:]";' else if '[[' -z '$awkcur' ']];' t hen 'awkcur="[a-z.:]";' else 'awkcur="^$awkcur";' 'fi;' 'fi;' 'fi;' if '[[' '${# kh[@]}' -gt 0 ']];' then 'COMPREPLY+=($(' awk ''\''BEGIN' '{FS=","}' '/^\s*[^|\# ]/' '{' 'sub("^@[^' ']+' '+",' '"");' '\' 'sub("' '.*$",' '"");' '\' for '(i=1;' 'i<=NF;' '++i)' '{' '\' 'sub("^\\[",' '"",' '$i);' 'sub("\\](:[0-9]+)?$",' '"", ' '$i);' '\' if '($i' '!~' '/[*?]/' '&&' '$i' '~' '/'\''"$awkcur"'\''/)' '{print ' '$i}' '\' '}}'\''' '"${kh[@]}"' '2>/dev/null' '));' 'fi;' if '[[' '${#khd[@]}' -gt 0 ']];' then for i in '"${khd[@]}";' do if '[[' '"$i"' == '*key_22_$curd*.p ub' '&&' -r '"$i"' ']];' then 'host=${i/#*key_22_/};' 'host=${host/%.pub/};' 'CO MPREPLY+=($host);' 'fi;' 'done;' 'fi;' for '((i=0;' i '<' '${#COMPREPLY[@]};' i+ + '))' do 'COMPREPLY[i]=$prefix$user${COMPREPLY[i]}$suffix;' 'done;' 'fi;' if '[ [' '${#config[@]}' -gt 0 '&&' -n '"$aliases"' ']];' then local 'hosts=$(' comman d sed -ne ''\''s/^[[:blank:]]*[Hh][Oo][Ss][Tt][[:blank:]]\{1,\}\([^#*?%]*\)\(#.* \)\{0,1\}$/\1/p'\''' '"${config[@]}"' ');' 'COMPREPLY+=($(' compgen -P '"$prefix $user"' -S '"$suffix"' -W '"$hosts"' -- '"$cur"' '));' 'fi;' 'COMPREPLY+=($(' co mpgen -W '"$(' ruptime '2>/dev/null' '|' awk ''\''!/^ruptime:/' '{' print '$1' ' }'\''' ')"' -- '"$cur"' '));' if '[[' -n '${COMP_KNOWN_HOSTS_WITH_HOSTFILE-1}' ' ]];' then 'COMPREPLY+=($(' compgen -A hostname -P '"$prefix$user"' -S '"$suffix" ' -- '"$cur"' '));' 'fi;' if '[[' -n '$ipv4' ']];' then 'COMPREPLY=("${COMPREPLY [@]/*:*$suffix/}");' 'fi;' if '[[' -n '$ipv6' ']];' then 'COMPREPLY=("${COMPREPL Y[@]/+([0-9]).+([0-9]).+([0-9]).+([0-9])$suffix/}");' 'fi;' if '[[' -n '$ipv4' ' ||' -n '$ipv6' ']];' then for i in '${!COMPREPLY[@]};' do '[[' -n '${COMPREPLY[i ]}' ']]' '||' unset -v 'COMPREPLY[i];' 'done;' 'fi;; }'
-bash: syntax error near unexpected token `;;'
+ [[ -n '' ]]
+ (( i=1 ))
+ (( i < 2-1 ))
+ [[ -n '' ]]
+ (( names_only && headers_only ))
+ (( names_only || headers_only ))
+ (( ignore_errors ))
+ [[ '' == \$\(* ]]
+ [[ '' == \$\{* ]]
+ [[ '' == \$* ]]
+ case "$prev" in
+ (( got_action ))
+ [[ ipset = - ]]
+ [[ '' = -* ]]
+ (( save_format || names_only || headers_only ))
+ (( res_sort ))
+ (( ignore_errors && use_file ))
+ (( ignore_errors ))
+ (( use_file ))
+ COMPREPLY=($( compgen -W 'create n add del test destroy x list save \
        restore flush rename e swap w help version' -- "$cur" ))
++ compgen -W 'create n add del test destroy x list save \
        restore flush rename e swap w help version' -- ''
+ [[ -n '' ]]

ChengChung (chengchung)
information type: Public → Public Security
ChengChung (chengchung)
information type: Public Security → Public
Revision history for this message
Sebastien Bacher (seb128) wrote :

Thank you for you bug report, it seems likely to have to do with the content of ~/.ssh/known_hosts , does it stop if you move that file away? If so could you try to figure what line is creating the issue and share it (or at least describe what it looks like even if you replace names/keys)

Changed in ipset (Ubuntu):
importance: Undecided → Low
status: New → Incomplete
Revision history for this message
ChengChung (chengchung) wrote :

there is no such ~/.ssh/known_hosts file exist.
I also try to create an empty one or copy a file with the same name from a 16.04 system, both turn to the same error message as above.

BTW, I find the log from 16.04 doesn't excute the code eval _ipset_known_hosts when trigger the auto completion
the log is like this https://paste.ubuntu.com/p/HHdD2DqQ7D/

Changed in ipset (Ubuntu):
status: Incomplete → New
Revision history for this message
ChengChung (chengchung) wrote :

I have compared the auto-complete file in ubuntu 18.04 package with the one in debian package

and find the difference is only a semicolon

:~/ipset/usr/share/bash-completion/completions# diff ipset /usr/share/bash-completion/completions/ipset
975c975
< eval '_ipset_known_hosts() { '$(declare -f _known_hosts_real | grep -v __ltrim_colon_completions | grep -Ev "^_known_hosts_real.*$" | grep -Ev "^(\{|\})")' }'
---
> eval '_ipset_known_hosts() { '$(declare -f _known_hosts_real | grep -v __ltrim_colon_completions | grep -Ev "^_known_hosts_real.*$" | grep -Ev "^(\{|\})")'; }'

replace the file of debian version works wekk for me.

Revision history for this message
Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in ipset (Ubuntu):
status: New → Confirmed
Revision history for this message
Sebastien Bacher (seb128) wrote :

It doesn't make much sense, that ";" is in the bionic .deb (https://bugs.launchpad.net/ubuntu/+source/ipset/6.34-1/+build/14248428/+files/ipset_6.34-1_amd64.deb)

Could you give the output of those commands
- dpkg -l | grep ipset
- debsums ipset (you might need to install the debsums deb first)

Revision history for this message
ChengChung (chengchung) wrote :

dpkg -l | grep ipset
ii ipset 6.34-1 amd64 administration tool for kernel IP sets
ii libipset3:amd64 6.34-1 amd64 library for IP sets

debsums ipset
/sbin/ipset OK
/usr/share/bash-completion/completions/ipset OK
/usr/share/doc/ipset/README OK
/usr/share/doc/ipset/copyright OK
/usr/share/lintian/overrides/ipset OK
/usr/share/man/man8/ipset.8.gz OK

Revision history for this message
Sebastien Bacher (seb128) wrote :

Is that with the Debian version of the file in place? Can you attach /usr/share/bash-completion/completions/ipset?

It looks like maybe you had a local edit/corruption and it's resolved now?

Revision history for this message
ChengChung (chengchung) wrote :

the result I post before is the version from ubuntu package

if replaced with debian version, the result of debsums ipset is
...
/usr/share/bash-completion/completions/ipset FAILED
...

the debian version can fix my problem.

Revision history for this message
ChengChung (chengchung) wrote :

I only replace the file for completion, and didn't change any other files on disk.

Revision history for this message
Oibaf (oibaf) wrote :

It works for me on a recent Ubuntu version, if you are still experiencing it with Ubuntu 20.04 or later please let us know.
Thanks

Changed in ipset (Ubuntu):
status: Confirmed → Incomplete
Revision history for this message
Launchpad Janitor (janitor) wrote :

[Expired for ipset (Ubuntu) because there has been no activity for 60 days.]

Changed in ipset (Ubuntu):
status: Incomplete → Expired
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Bug attachments

Remote bug watches

Bug watches keep track of this bug in other bug trackers.