如何提取远程 VM 的 OS 版本并将其设置为远程 VM 上的环境变量,并在 expect 脚本中进一步使用?

How can I extract the OS version of a remote VM and set it as an environment variable on the remote VM and also to use further in the expect script?

我正在尝试获取远程 VM 的 OS 版本并将其作为环境变量添加到同一个 vm 上,并且还在期望脚本所在的主机 vm 上进一步使用获取的值已执行。

我正在尝试导出获取值的值。但是变量没有被设置。

send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers`\r"
expect -re $prompt

我看到以下问题:

 can't read "vers": no such variable
    while executing
"send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers`\r""

值已设置到远程 vm 上的变量中,我应该可以在 expect 脚本中使用它。

这里有几个问题。首先,回想一下 expect 使用与 sh 相同的语法来表示变量表达式。也就是说,如果我在 expect 脚本中设置一个变量:

set somevar "somevalue"

我可以打印出来 运行ning:

puts "$somevar"

这意味着当你有这样的命令时...

send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers`\r"

...然后 expect 将在将该文本发送到连接的进程之前尝试扩展 $vers 变量。您看到的错误来自 expect;我们可以这样重现它:

expect1.7> puts "$var_that_does_not_exist"
can't read "var_that_does_not_exist": no such variable

您需要转义字符串中的 $,如下所示:

send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers`\r"

这会将预期的命令发送到您的 shell。


我怀疑可能存在第二个问题:您正在将变量 vers 设置为以下内容的输出:

rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$' && echo $vers

不清楚为什么你在最后得到 echo $vers。由于在您 运行 此命令时未设置 $vers,因此它只会在输出中添加一个空行。我相信你想要的只是:

send "export vers=`rpm -q --queryformat '%{RELEASE}' rpm | grep -o '.$'`"