Kali Linux는 Bash 명령 "set"을 사용하여 이상한 코드 줄을 표시합니다.

Kali Linux는 Bash 명령 "set"을 사용하여 이상한 코드 줄을 표시합니다.

Debian/GNU Linux("wheezy") 기반 배포판인 Kali8을 설치했습니다. LXterminal에서와 마찬가지로 Bash 내장 명령 "set"을 사용하여 X에서 변수를 확인하면 모든 것이 잘 작동합니다. 이를 위해 콘솔 VT 또는 SSH/Putty를 통해 로그인하면 몇 가지 변수와 여러 줄의 코드(일종의 완성 스크립트에서 나온 것처럼 보이는 수천 줄)가 표시됩니다.

또 다른 점은 몇 주 전에 시스템을 처음 설치할 때 목록이 더 짧았으며 줄 수가 점차 늘어나서 시간이 지남에 따라 목록이 길어질 것이라는 점입니다. 목록에는 항상 시작 부분에 있어야 하는 실제 변수가 있고 끝에 같은 코드 줄이 있으므로 추가된 줄이 중간에 있다고 가정합니다. 마지막 항목을 확인하기 위해 목록을 파일로 파이프한 다음 며칠 후에 다시 수행하여 크기가 더 커지는지 확인합니다.

어쨌든, 수천 줄의 알 수 없는 스크립트 코드가 인쇄되고 있다는 사실을 해결하는 이유와 방법을 아는 사람이 있습니까?

예는 다음과 같습니다.


root@kali:~# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:interactive_comments:$
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="37" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.2.37(1)-release'
COLUMNS=80
COMP_WORDBREAKS=$' \t\n"\'>=;|&(:'
DIRSTACK=()
EUID=0
GROUPS=()
HISTFILE=/root/.bash_history
HISTFILESIZE=500
HISTSIZE=500
HOSTNAME=kali
HOSTTYPE=x86_64
IFS=$' \t\n'
LANG=en_US.UTF-8
LIBGL_DRIVERS_PATH=/usr/lib32/dri:/usr/lib64/dri
LINES=24
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;$
LS_OPTIONS='--color=auto -F'
MACHTYPE=x86_64-pc-linux-gnu
MAIL=/var/mail/root
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PIPESTATUS=([0]="1" [1]="0")
PPID=10987
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
PS4='+ '
PWD=/root
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.10.143 10827 22'
SSH_CONNECTION='192.168.10.143 10827 192.168.10.104 22'
SSH_TTY=/dev/pts/1
TERM=xterm
UID=0
USER=root
XDG_SESSION_COOKIE=fb89d5d02d263ebdcf49f3a551dccb8b-1374307938.708154-385548377
_=
__colormgr_commandlist=$'\n    create-device\n    create-profile\n    delete-device\n    delete-p$
__git_all_commands=
__git_diff_common_options=$'--stat --numstat --shortstat --summary\n\t\t\t--patch-with-stat --nam$
__git_fetch_options=$'\n\t--quiet --verbose --append --upload-pack --force --keep --depth=\n\t--t$
__git_log_common_options=$'\n\t--not --all\n\t--branches --tags --remotes\n\t--first-parent --mer$
__git_log_date_formats='relative iso8601 rfc2822 short local default raw'
__git_log_pretty_formats='oneline short medium full fuller email raw format:'
__git_log_shortlog_options=$'\n\t--author= --committer= --grep=\n\t--all-match\n'
__git_merge_options=$'\n\t--no-commit --no-stat --log --no-log --squash --strategy\n\t--commit --$
__git_merge_strategies=
__git_mergetools_common=$'diffuse ecmerge emerge kdiff3 meld opendiff\n\t\t\ttkdiff vimdiff gvimd$
__git_porcelain_commands=
__git_send_email_confirm_options='always never auto cc compose'
__git_send_email_suppresscc_options='author self cc bodycc sob cccmd body all'
__git_whitespacelist='nowarn warn error error-all fix'
__grub_script_check_program=grub-script-check
_backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
_xspecs=([freeamp]="!*.@(mp3|ogg|pls|m3u)" [cdiff]="!*.@(dif?(f)|?(d)patch)?(.@([gx]z|bz2|lzma))"$
__colormgrcomp ()
{
    local all c s='
' IFS=' ''      ''
';
    local cur="${COMP_WORDS[COMP_CWORD]}";
    if [ $# -gt 2 ]; then
    fi;
    for c in $1;
    do
        case "$c$4" in
            *.)
                all="$all$c$4$s"
            ;;
            *)
                all="$all$c$4 $s"
            ;;
        esac;
    done;
    IFS=$s;
    COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"));
    return
}
__dconf ()
{
    local choices;
...

********... thousands of lins after... **********
...
{
    local userland=$( uname -s );
    [[ $userland == @(Linux|GNU/*) ]] && userland=GNU;
    [[ $userland == $1 ]]
}
_variables ()
{
    if [[ $cur =~ ^(\$\{?)([A-Za-z0-9_]*)$ ]]; then
        [[ $cur == *{* ]] && local suffix=} || local suffix=;
        COMPREPLY+=($( compgen -P ${BASH_REMATCH[1]} -S "$suffix" -v --             "${BASH_REMAT$
        return 0;
    fi;
    return 1
}
_xfunc ()
{
    set -- "$@";
    local srcfile=$1;
    shift;
    declare -F $1 &>/dev/null || {
        local compdir=./completions;
        [[ $BASH_SOURCE == */* ]] && compdir="${BASH_SOURCE%/*}/completions";
        . "$compdir/$srcfile"
    };
    "$@"
}
_xinetd_services ()
{
    local xinetddir=/etc/xinetd.d;
    if [[ -d $xinetddir ]]; then
        local restore_nullglob=$(shopt -p nullglob);
        shopt -s nullglob;
        local -a svcs=($( printf '%s\n' $xinetddir/!($_backup_glob) ));
        $restore_nullglob;
        COMPREPLY+=($( compgen -W '${svcs[@]#$xinetddir/}' -- "$cur" ));
    fi
}
quote ()
{
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline ()
{
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}


root@kali:~#

추신: 그런데, 아마도 주제에서 벗어난 내용일 것입니다. 위 줄은 이어야 하지만 StackExchange MarkDown 및 HTML과 혼동되는 것 같아서 COMP_WORDBREAKS=$' \t\n"\'><=;|&(:'삭제해야 했습니다 ... 이 전체 줄을 위 줄에 입력하면 실제로는 <그 이후에는 /dev/null로 표시되며 >, 그러면 그 이후의 나머지 줄 대부분이 내 게시물에 표시되지 않습니다...흠...이상합니다.

답변1

Bash 완료는 정의된 함수를 사용합니다. 데비안에서는 파일을 /etc/bash_completion가져온 다음 소스 파일의 모든 파일을 가져옵니다 /etc/bash_completion.d. 일부 명령줄 응용 프로그램은 새로운 완성 파일을 설치합니다. git귀하의 출력이 좋은 예입니다. git che[TAB]fetch 와 같은 작업을 탭으로 이동할 수 있습니다 git checkout. 고급 완성 기능을 원하지 않으면 . /etc/bash_completion쉘 초기화 파일에서 제거하세요.

관련 정보