Избегайте всех специальных символов для ожидания отправки в bash

Мне нужно отправить несколько строк с ожиданием в систему через telnet, и я получил следующие примерные строки:

    $ cat SERVERTEMPPASSWORDLIST.txt
    SID=21|21|asldf8j2sRa2255||2840400|
    SID=21|27|ala"sd8fjs2A"$||2840400|alsd8fj2s%"aa
    SID=21|27|alsd"8fujs!"sl9a2e4|asdf2$sa5$23|2840400|asdfs2asl92
    SID=21|21|holysshit||2840400|

Скрипт должен сделать это:

    $ cat test.sh
    #!/usr/bin/env bash
    (
        grep -E "SID=${sid}" SERVERTEMPPASSWORDLIST.txt | while read line; do
            TCID=$(echo ${line} | cut -d '|' -f 2)
            TSPW="$(echo ${line} | cut -d '|' -f 3)"
            TCPW="$(echo ${line} | cut -d '|' -f 4)"
            DURATION="$(echo ${line} | cut -d '|' -f 5)"
            DESC="$(echo ${line} | cut -d '|' -f 6)"

            if [[ "${TCPW}" != "" ]]; then
                cat <<- ADDENTRY
                    expect "error id=0 msg=ok"
                    send "addentry pw=${TSPW} desc=${DESC} duration=${DURATION} tcid=${TCID} tcpw=${TCPW}\r"
                ADDENTRY
            else
                cat <<- ADDENTRY
                    expect "error id=0 msg=ok"
                    send "addentry pw=${TSPW} desc=${DESC} duration=${DURATION} tcid=${TCID}\r"
                ADDENTRY
            fi
        done
    ) | expect > RESULT.txt

Что касается некоторых специальных символов, таких как «и $», он не выводит сообщение об ошибке, в котором есть дополнительные символы после закрывающей кавычки, или, например, он не может найти переменную «sa5».

    $ ./test.sh
    extra characters after close-quote
        while executing
    "send "addentry pw=ala"s"

Некоторый текст, который мне нужно отправить с ожиданием, уже экранирован, потому что пробелы нужно отправлять как '\ s' вместо ''. Например, вы бы отправили

    Hello World!

as

    Hello\sWorld!

Важно, чтобы не было двойных выходов.


person user2966991    schedule 24.10.2015    source источник


Ответы (2)


Решение состоит в том, чтобы заключить строку в фигурные скобки:

            cat <<- ADDENTRY
                expect "error id=0 msg=ok"
                send {addentry pw=${TSPW} desc=${DESC} duration=${DURATION} tcid=${TCID} tcpw=${TCPW}}
                expect "error id=0 msg=ok"
                send "\r"
            ADDENTRY
person user2966991    schedule 24.10.2015

Такое смешивание языков вызовет у вас горе. Просто используйте expect. И что вы нерестите?

#!/usr/bin/env expect

set sid [lindex $argv 0]
set fid [open SERVERTEMPPASSWORDLIST.txt r]

spawn ???

while {[gets $fid line] != -1} {
    if { ! [string match "*SID=$sid*" $line} continue

    # string replacements
    set line [string map {{ } {\s} {"} {\"}} $line]
    lassign [split $line |] tcid tspw tcpw duration desc

    if {$tcpw ne ""} {
        expect "error id=0 msg=ok"
        send "addentry pw=$tspw desc=$desc duration=$duration tcid=$tcid tcpw=$tcpw\r"
    } else {
        expect "error id=0 msg=ok"
        send "addentry pw=$tspw desc=$desc duration=$duration tcid=$tcid tcpw=$tcpw\r"
    }
}

И передайте SID в качестве первого аргумента ожидаемому сценарию.

person glenn jackman    schedule 26.10.2015
comment
Скрипт содержит более 3100 строк, поэтому я смешал языки - мне нужны некоторые функции bash. Приведенный выше ответ отлично работает. В любом случае спасибо за вашу помощь! - person user2966991; 26.10.2015
comment
Мне очень любопытно, какие функции bash вам нужны, которых нет в Tcl / Expect. В любом случае, удачи в поддержании этого сценария. - person glenn jackman; 27.10.2015
comment
Ладно извини. Я немного неправильно выразился. Я хочу позволить пользователю выбирать, использовать ли вы bash или ожидать. - person user2966991; 27.10.2015