防止expect脚本寻找变量

问题描述 投票:0回答:1

我有以下功能。它测试 SFTP 服务器连接。它完成了它应该做的事情,但它有一个让我头疼的边缘情况。当变量 SFTP_SERVER_PASSWORD 包含美元符号时,它将不起作用,因为期望脚本认为它必须搜索变量。

function test_sftp_connection() {
expect << EOF
log_user 1
spawn -noecho sftp -P $SFTP_SERVER_PORTNUMBER $SFTP_SERVER_USERNAME@$SFTP_SERVER_HOSTNAME
expect "password:"
send "$SFTP_SERVER_PASSWORD\r"
expect {
    "sftp>" {
      send "exit\r"
      expect eof
      exit 0
    }
    timeout {
      exit 1
    }
  }
EOF
}

我尝试了各种解决方案:

  1. send $SFTP_SERVER_PASSWORD"\r"
  2. send "$SFTP_SERVER_PASSWORD\r"
  3. send "'$SFTP_SERVER_PASSWORD'\r"

但是他们最终都遇到了同样的错误:

'can't read "[few letters after dollar-sign in password]": no such variable'.

我想这很难,因为它在期望脚本中使用 Bash 变量。但我仍然认为这个问题应该是可以解决的。有人对如何解决这个问题有任何想法吗?

bash expect
1个回答
0
投票

从Tcl语言的角度来看:

如果你想按字面意思发送 $,你必须转义

$

 send "\$your password\r"

但是您的文本很复杂,因为您向 Tcl 传递了一个字符串,该字符串由 shell 进行插值。这意味着如果您有一个 shell 变量

SFTP_SERVER_PASSWORD
,并且该变量包含
$
,则不会有转义。

一种解决方案是用字符串

$
替换 shell 变量中的每个
\$
。但在我看来,这很麻烦而且容易出错。类似的可能性是在调用 Tcl 之前将 shell 变量放入环境中,即

export SFTP_SERVER_PASSWORD

然后在你的 Tcl 脚本中执行一个

send $env(SFT_SERVER_PASSWORD)
© www.soinside.com 2019 - 2024. All rights reserved.