Expect Script:抓取bash命令的输出并设置变量

时间:2018-04-20 23:26:19

标签: shell scripting redhat expect aix

我很期待;但是,我有一个当前预期的脚本需要修改,我很难过。

这是我正在尝试做的事情,

主机 HOSTNAME | awk'{print $ 3}'| awk -v FS ='。' '{print $ 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 个答案:

答案 0 :(得分:0)

由于您在本地计算机上执行该操作,并且该命令没有任何交互性,因此只需使用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