期望脚本:获取 bash 命令的输出并设置变量
Posted
技术标签:
【中文标题】期望脚本:获取 bash 命令的输出并设置变量【英文标题】:Expect Script: Grabbing the output of a bash command and setting a variable 【发布时间】:2018-10-01 17:12:06 【问题描述】:我还很陌生;但是,我有一个当前需要修改的期望脚本,我很难过。
这就是我想要做的,
主机主机名 | awk '打印 $3' | awk -v FS='.' '打印 $4' | tr -d ','
如果结果是特定数字(IP 地址的第 4 个八位字节),则将变量分配给要在脚本中使用的特定值。如果是不同的值,则为其分配不同的变量值。
关于我正在尝试对脚本执行的操作的更多详细信息: - 我有 2 个不同的环境(都以特定的第 4 个八位字节结尾) - scp 一个文件到远程服务器(每个环境都有不同的文件) - 连接到系统(每个环境的登录提示也不同,因此为每个环境传递不同的值)
* 抱歉,如果这令人困惑 *
这是我目前所拥有的(是的,我改变了一些价值观以保护我的环境)。
spawn host hostname | awk print \$3 | awk -v FS=. print \$4 | tr -d ,
expect -exact 15
set PSWPROMPT password:
set REXPECT remotescript.exp
-exact 10
set PSWPROMPT Password:
set REXPECT remotescript.exp_rh
send_user $PSWPROMPT $REXPECT
expect "$"
spawn scp -p filename user@hostname:PATH_FILENAME*
expect -exact "connecting (yes/no)?"
send "yes\r"
expect -exact $PSWPROMPT
send "filename\r"
-exact $PSWPROMPT
send "filename\r"
expect "$"
spawn scp -p filename user@hostname:PATH_FILENAME
expect -exact "connecting (yes/no)?"
send "yes\r"
expect -exact $PSWPROMPT
send "password\r"
-exact $PSWPROMPT
send "password\r"
expect "$"
spawn scp -p $REXPECT *username*@$hostname:PATH_FILENAME*
expect -exact "connecting (yes/no)?"
send "yes\r"
expect -exact $PSWPROMPT
send "password\r"
-exact $PSWPROMPT
send "password\r"
expect "$"
【问题讨论】:
【参考方案1】:由于您在本地计算机上执行该命令,并且该命令没有任何交互性,因此只需使用 exec
并捕获输出:
set output [exec host hostname | awk print $3 | awk -v FS=. print $4 | tr -d ,]
请注意,Tcl/expect 中的花括号就像 shell 中的单引号一样。要将所需的大括号传递给 awk,我们需要将大括号加倍。或者使用双引号,并转义 awk 美元符号:
set output [exec host hostname | awk "print \$3" | awk -v FS=. "print \$4" | tr -d ,]
或者我们可以在期望中做很多工作:
set host_output [exec host hostname]
set first_list [lindex [split $output \n] 0]
set 3rd_word [lindex [split $first_line] 2]
set 4th_octet [lindex [split $3rd_word .] end]
set no_commas [string map , "" $4th_octet]
OR 使用正则表达式:
regexp .*\.(\d+) [exec host hostname] -> last_octet
【讨论】:
以上是关于期望脚本:获取 bash 命令的输出并设置变量的主要内容,如果未能解决你的问题,请参考以下文章