Как очистить вывод от expect?

Вы можете получить PID, а затем прочитать файл /prc/$pid/cmdline, чтобы увидеть команду, используемую для его запуска.:

pid=123
com=$(perl -pe 's/\0/ /g' /proc/$pid/cmdline)
kill 123 && "$com"

Таким образом, вы можете превратить это в функцию:

restartPid(){
    pid=$1
    com=$(perl -pe 's/\0/ /g' /proc/"$pid"/cmdline)
    kill 123 && "$com"
}

Однако это не будет работать в более сложных случаях, когда команда выполнялась в определенной среде. Вы можете начать создавать больше и расширить это, чтобы также включить среду с чем-то вроде этого:

restartPid(){
  pid=$1
  tempFile=$(mktemp)
  perl -pe 's/\0/\n/g' /proc/"$pid"/environ |
    perl -pe 's/^([^=]+)=(.*)/$1="$2"/' > "$tempFile"
  read -r com args < <(perl -lne '@k=split(/\0/); print "$k[0] ",  join " ", map "\"$_\"", @k[1..$#k]' /proc/"$pid"/cmdline)
    dir=$(readlink -f "/proc/$pid/cwd")    
    kill $pid
    (. \"$tempFile\"; cd "$dir"; eval $com $args )
}

Однако, как видите, это становится довольно сложным, и я не могу гарантировать, что это всегда будет работать. Хотя должно быть хорошее начало.

1
30.01.2021, 23:47
2 ответа

Захватите нужные данные с помощью регулярного выражения для шаблона ожидания:

send -- "command to generate CSR"
send -- "\r"
expect -re "(-+BEGIN CERTIFICATE REQUEST-+.+-+END CERTIFICATE REQUEST-+)"

Затем запишите только захваченный текст в файл, удалив каретку

set csr_text [regsub -all {\r\n} $expect_out(1,string) {\n}]
set fh [open $csr w]
puts $fh $csr_text
close $fh
2
18.03.2021, 22:33

Надеюсь, есть ответ только с expect, но если нет, вы можете опубликовать -процесс с awk:

$ awk '
    BEGIN {
        beg = "-----BEGIN CERTIFICATE REQUEST-----"
        end = "-----END CERTIFICATE REQUEST-----"
    }
    { sub(/\r$/,"") }
    sub(".*"beg,beg),sub(end".*",end)
' file
-----BEGIN CERTIFICATE REQUEST-----
MIICoDCCAYgCAQAwWzEfMB0GA1UEAxMWc3dpdGNoMS5ob21lLmdvc3NldC51azENM
AsGA1UECxMEaG9tZTEPMA0GA1UECh~~~~~~*SNIP*~~~~~~3lsRknVNg/ZAATDaRC
KR3EIZFS3izUZ/+3wYzni84QZcp6s6HmDaB2moRRarVThXnbcF0a5nvGQtU8j7jP
J/RPoWPRQa7vsfnEgN+gjQj6EYHeD/uMKzYPWeKEyQ4VPmw7K/VLySbMg==
-----END CERTIFICATE REQUEST-----

Я всегда советую не использовать выражения диапазона вместо флагов (см. https://stackoverflow.com/q/23934486/1745001), но, поскольку вы никогда не будете использовать это ни для чего другого, я понимаю, какого черта.

1
18.03.2021, 22:33

Теги

Похожие вопросы