Сбросить все специальные символы для ожидания отправить в Баш

Мне нужно отправить некоторые строки с ожидаемым в систему через 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!

как

    Hello\sWorld!

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

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

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

#!/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 в качестве первого аргумента ожидаемого сценария

Другие вопросы по тегам