【问题标题】:Export Bash command-line-argument variables for use in embedded Expect导出 Bash 命令行参数变量以在嵌入式 Expect 中使用
【发布时间】:2013-03-02 03:18:40
【问题描述】:

echo 测试显示我的命令行变量正在工作,但我如何传递、导出它们以用于嵌入的 expect

#!/bin/bash

echo name of script is $0
echo host is $1
echo hostusername is $2
echo hostpassword is $3

expect -c 'spawn ssh -l $2 $1 < ./sf-wall_scp_bash.sh
sleep 2

expect {
"(yes/no)? " {send "yes\n"}
    exp_continue
}

expect {
"?assword" {send "$3\r"}
}
sleep 1
'

如果使用expect shebang 调用,它的工作方式类似于

#!/usr/bin/expect

set host [lindex $argv 0]
set hostusername [lindex $argv 1]
set hostpassword [lindex $argv 2]


spawn ssh -l $hostusername $host
sleep 2

expect {
"(yes/no)? " {send "yes\n"}
    exp_continue
}

expect {
"?assword" {send "$hostpassword\r"}
}
sleep 1

...按预期工作。我需要使用bash 并嵌入expect,因为脚本需要调用bash 特定的命令、函数、内置变量...否则简单地使用第二个示例将是一个可行的选项,但事实并非如此。

我尝试过声明和导出命令行参数变量,并将上面第一个示例中的 $1、$2、$3 分别更改为声明和导出的变量名,这适用于我实际声明的另一个脚本脚本中的变量...不同之处在于它们不是命令行参数。

host=$1
export host
hostusername=$2
export hostusername
hostpassword=$3
export hostpassword

以及只是导出它们

export host
export hostusername
export hostpassword

并尝试上面的第一个示例。没有变化,expect继续申领

无法读取“X”:没有这样的变量

在另一个 bash 脚本中,我能够成功地导出变量,方法是同时声明它们,然后像​​上面的示例一样导出它们。但是我无法将bash命令行参数变量传递给expect

【问题讨论】:

  • 在您的初始脚本中,尝试使用双引号。单引号(按设计)不能替代变量。您需要在期望脚本中转义(使用反斜杠)任何文字双引号或美元符号。
  • ssh 旨在强制人们不要将密码放入脚本和文件中。期望撤消该设计。考虑 ssh 密钥。它们不难实施。
  • @jimmcnamara ssh 登录信息不是我将使用命令行参数的唯一内容,我只是将其包含在我的示例中。此外,密码没有放在脚本文件中,它们是动态的并且特定于我无法设置密钥的机器以及为什么通过 CLI 参数提供它们。

标签: bash variables command-line-arguments expect


【解决方案1】:

带有嵌套引号的代码不容易编写和阅读。我建议您使用 shell 的 here-document 语法。例如(演示将bash vars 传递给expect 的两种方式):

$ cat foo.sh
arg1=$1
export arg2=$2

expect << END
puts $arg1
puts \$env(arg2)
END
$ bash foo.sh hello world
hello
world
$

我更喜欢 shell 中的 export var 并在期望中使用 $env(var) 引用它,因为您不必担心 var 是否有一些特殊字符(如 '" 或空格)在里面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2023-04-08
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多