【发布时间】: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