^ 通过 ssh 调用时 awk 中出现语法错误

^ 通过 ssh 调用时 awk 中出现语法错误

我正在运行文件系统使用命令来检测/var从一台主机到多个远程主机的文件系统使用率是否超过 80%。

我的命令运行良好 ( df -h /var | awk '$1 > 80'),但ssh它给了我语法错误。

for i in `cat /etc/gridhosts`; do ssh -n -o BatchMode=yes ${i} "df -h /var | awk '$4 > 80'" ; done
awk:  > 80
awk:  ^ syntax error
awk:  > 80
awk:  ^ syntax error
awk:  > 80

答案1

问题在于程序$4awk是双引号字符串的一部分。由于它用双引号引起来,(本地)shell 将在调用之前展开它ssh

在 shell 中,$4是第四个位置参数,很可能为空。这意味着代码$4中的awk将会被替换为空字符串,从而产生无效的awk程序。

在这种情况下,无需awk在远程主机上运行该命令。相反,只需做

while IFS= read -r remote; do
    ssh -n -o BatchMode=yes "$remote" 'df /var' | awk 'FNR == 2 && $5 > 80'
done </etc/gridhosts

请注意,我已将awk代码更改为$5在第 2 行而不是在$4每一行查看,因为这是百分比通常所在的位置。另外,我删除了 for-h选项,df因为不需要它,并且我让循环逐行读取输入文件,而不是在for循环头中扩展文件的完整内容(这是不优雅的,并且可以在一般情况下,不必要地消耗大量内存)。

您可能还对评估 Ansible 或类似软件感兴趣,因为这将使集群范围的操作变得更加容易。

相关内容