如何在循环中将变量传递给远程执行的命令?

时间:2019-03-26 21:36:59

标签: shell ssh

我正在尝试编写Shell脚本以远程打开和关闭esxi服务器上的VM。由于vmid不是静态的,因此我必须grep出主机名,然后使用awk仅获取第一列。以下命令可以正常工作:

ssh 192.168.0.10 'VMID="$(vim-cmd vmsvc/getallvms | grep HPDesktop2  | awk "{print $1}" )"; vim-cmd vmsvc/power.off $VMID'

我想做的是在一个单独的文件中列出一个主机名,循环遍历这些主机名,然后在每个主机名上运行命令。我尝试了以下方法:

while read ID; do

ssh 192.168.0.10 'VMID="$(vim-cmd vmsvc/getallvms | grep $ID  | awk "{print $1}" )"; vim-cmd vmsvc/power.off $VMID'

done <Hostnames

似乎没有传递变量,因为我得到了有关grep用法和以下错误的说明:

  

用法:power.off vmid

     

关闭指定的虚拟机。

     

参数不足。

1 个答案:

答案 0 :(得分:0)

您遇到的问题的示例:

ubuntu@ubuntu:~$ hello="hi"
ubuntu@ubuntu:~$ echo '$hello'
$hello
ubuntu@ubuntu:~$ 

作为ssh参数传递的命令用单引号引起来,因此不会在本地计算机上进行评估。这是一个问题,因为ID变量仅存在于在本地计算机上运行的脚本的上下文中。也许使用引号,而我们使用\"来将引号内的引号转义?