【问题标题】:Expect Script: Grabbing the output of a bash command and setting a variable期望脚本:获取 bash 命令的输出并设置变量
【发布时间】: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 "$"

【问题讨论】:

    标签: shell scripting redhat expect aix


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2020-03-22
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 2012-04-03
      相关资源
      最近更新 更多