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

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

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

有没有办法解决?

答案1

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

expect1.1> set pass "\$Hunter2"
$Hunter2
expect1.2> set pass {$Hunter2}
$Hunter2

三!三种方式:从文件中读取密码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

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

#!/usr/bin/env expect

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

puts $results

这可能看起来像:

$ 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
$ 

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

#!/usr/bin/env expect
set password $env(pass)
puts $password

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

#!/usr/bin/env expect
set password $env(pass)
unset env(pass)
...

答案2

我遇到了类似的问题,我想在$期望脚本中传递 fileName ,以下对我有用

filePath=$(echo -n $filePath | sed -e 's/\$/\\\$/g')

相关内容