bash脚本登录多个Linux服务器并通过ssh收集多个命令的输出

bash脚本登录多个Linux服务器并通过ssh收集多个命令的输出

我需要通过 .gnu/linux 服务器登录并收集以下命令的输出SSH。我已经完成了无密码身份SSH验证。我想用 bash 脚本来做到这一点。

df -lh | awk '{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'
top -b -n1 | grep "Cpu(s)" | awk '{print 100 - $5}'

我尝试了下面的命令,但不是引用“命令”,如果给出单个命令,就像df 它正在工作一样..但给出类似长命令:

df -lh | awk '{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'
top -b -n1 | grep "Cpu(s)" | awk '{print 100 - $5}'

它不工作..

答案1

我建议使用一些并行 SSH 工具,例如 '冲撞' 或者 'PDSH',输出会更加优雅。

假设我们的服务器名称是“host01”到“host09”,您的命令将如下所示:

clush -Bw host0[1-9] "df -lh | awk '{if (\$5 >= 20) { print \$6 \""  \"" \$2 "\"   \""  \$3  "\"  \"" \$5 }}';top -b -n1 | grep 'Cpu(s)' | awk '{print 100 - \$5}'"

注意逃逸。

答案2

第1步:将其写入脚本

cat script.sh
df -lh | awk '{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'
top -b -n1 | grep "Cpu(s)" | awk '{print 100 - $5}'

第2步:scp将其发送给主机。 (scp 是安全副本),主机位于$h

scp script.sh $h:/tmp

第3步:执行它

ssh $h bash /tmp/script.sh

您可能希望重定向输出

ssh $h bash /tmp/script.sh > result-$h.txt

答案3

如果您想运行这些行而不编写单独的脚本文件,则需要用双引号将命令括起来,并转义可能与之冲突的任何字符。例如:

ssh your-host "
df -lh | awk '{if (\$5 >= 20) { print \$6 \"  \" \$2 \"   \"  \$3  \"  \" \$5 }}'
top -b -n1 | grep \"Cpu(s)\" | awk '{print 100 - \$5}'"

或者使用单引号:

ssh your-host'
df -lh | awk '"'"'{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'"'"'
top -b -n1 | grep "Cpu(s)" | awk '"'"'{print 100 - $5}'"'"

或者使用此处文档:

ssh your-host "$(cat << 'END'
df -lh | awk '{if ($5 >= 20) { print $6 "  " $2 "   "  $3  "  " $5 }}'
top -b -n1 | grep "Cpu(s)" | awk '{print 100 - $5}'
END
)"

最后一个选项的缺点是使用更多行,但它不需要您更改命令中的任何内容。

相关内容