我正在尝试编写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
关闭指定的虚拟机。
参数不足。
答案 0 :(得分:0)
您遇到的问题的示例:
ubuntu@ubuntu:~$ hello="hi"
ubuntu@ubuntu:~$ echo '$hello'
$hello
ubuntu@ubuntu:~$
作为ssh参数传递的命令用单引号引起来,因此不会在本地计算机上进行评估。这是一个问题,因为ID
变量仅存在于在本地计算机上运行的脚本的上下文中。也许使用引号,而我们使用\"
来将引号内的引号转义?