Quando sed é usado em um comando expect, qual é a maneira correta de escapar das barras invertidas?

0

Atualmente, tenho o seguinte código para um script ssh automatizado:

#!/usr/bin/expect -f

set pw "mypass"
spawn ssh [email protected]

expect "Password:"
send "$pw\r"

expect "Verification code:"
send "/usr/local/bin/authtool --totp --base32 $(sed -n '/^secret=/s///p' ~/.Auth.sc)\r"

Essencialmente, tenho um procedimento em duas etapas para login. Primeiro a senha (que está funcionando) e, em segundo lugar, a autenticação (que não é).

Sempre que chego à parte sed, ela retorna:

can't read "(sed -n '/^secret=/s///p' ~/.Auth.sc)": no such variable
    while executing

Não sei o que fazer, mas suspeito que isso tenha a ver com as barras invertidas e a fuga delas. Estou no caminho certo?

    
por user321627 03.10.2018 / 02:59

2 respostas

0

Tente isso,

Basicamente, no script expect , nesta parte do código:

send "/usr/local/bin/authtool --totp --base32 $(sed -n '/^secret=/s///p' ~/.Auth.sc)\r"

Está tratando $(sed -n '/^secret=/s///p' ~/.Auth.sc) como uma variável expect, que na verdade não é.

Então, tente fazer isso, ou seja, escapar de $ ( )

send "/usr/local/bin/authtool --totp --base32 \$\(sed -n '/^secret=/s///p' ~/.Auth.sc\)\r"

Ou tente usar os backticks.

send "/usr/local/bin/authtool --totp --base32 'sed -n '/^secret=/s///p' ~/.Auth.sc'\r"
    
por 03.10.2018 / 07:56
0

Em Tcl , o [...] é equivalente a $(...) , então você deve estar escrevendo seu código como:

send "/usr/local/bin/authtool --totp --base32 [exec sed -n '/^secret=/s///p' $::env(HOME)/.Auth.sc]\r"
    
por 04.10.2018 / 04:30