当 sed 在expect命令中使用时,转义反斜杠的正确方法是什么?

当 sed 在expect命令中使用时,转义反斜杠的正确方法是什么?

我目前有以下自动 ssh 脚本代码:

#!/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"

本质上,我有一个两步的登录过程。首先是密码(有效),其次是身份验证(无效)。

每次我到达 sed 部分时,它都会返回:

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

我不知道该怎么做,但高度怀疑与反斜杠和转义它们有关。我走在正确的轨道上吗?

答案1

在 中Tcl[...]相当于$(...),因此您应该将代码编写为:

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

答案2

尝试这个 ,

基本上在expect脚本中,在这部分代码中:

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

它被$(sed -n '/^secret=/s///p' ~/.Auth.sc)视为期望变量,但事实上并非如此。

所以尝试这样做,即逃避$ ( )

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

或者尝试使用反引号。

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

相关内容