如何让 `expect` 忽略密码中的 $(美元符号)?

J. *_*rge 3 scripting expect variable

我正在运行一个expect脚本,密码有一个$字符。外壳会寻找以下字符以扩展成某些内容并吐出no such variable

有没有办法解决?

thr*_*rig 6

有两种方式;要么反斜杠每个特殊字符,要么在密码周围使用花括号:

expect1.1> set pass "\$Hunter2"
$Hunter2
expect1.2> set pass {$Hunter2}
$Hunter2
Run Code Online (Sandbox Code Playgroud)

三!三种方式:从文件中读取密码thepasswordfile;这具有密码不在代码中的优点:

#!/usr/bin/env expect

# wrap with catch(n) or try(n) if you don't want an error to abort 
# the code...
set fh [open thepasswordfile]
set password [gets $fh]

puts $password
Run Code Online (Sandbox Code Playgroud)

四、从在标准输出上生成密码的程序中收集密码:

#!/usr/bin/env expect

if {[catch {exec ./getthepassword} results options]} {
    puts $results
    exit 1
}

puts $results
Run Code Online (Sandbox Code Playgroud)

这可能看起来像:

$ cat fromstdin 
#!/usr/bin/env expect

if {[catch {exec ./getthepassword} results options]} {
    puts $results
    exit 1
}

puts $results

$ cat getthepassword 
#!/bin/sh
echo '$Hunter2'

$ chmod +x fromstdin getthepassword
$ ./fromstdin 
$Hunter2
$ 
Run Code Online (Sandbox Code Playgroud)

五!五种方式,也可以从环境中读取密码( environ(7), tclvars(n))

#!/usr/bin/env expect
set password $env(pass)
puts $password
Run Code Online (Sandbox Code Playgroud)

假设export pass='$Hunter2'在调用此实现之前已在父进程中完成或等效。缺点:环境变量会传递给任何和所有子进程,这些子进程可能需要也可能不需要有权查看密码。如果有疑问,请在使用或复制变量后取消设置:

#!/usr/bin/env expect
set password $env(pass)
unset env(pass)
...
Run Code Online (Sandbox Code Playgroud)