从 for 循环的 ssh 获取输出

从 for 循环的 ssh 获取输出

我需要获取远程服务器上哪个进程使用最多交换空间的结果。我正在使用下面的命令,如果我登录到远程并运行它,它可以正常工作,但如果我使用 ssh 远程运行它,它不会给出任何输出。我需要使用 ssh,因为我将在脚本中对多个服务器执行此操作

ssh someserver "for file in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " " $3} END{print ""}' $file; done | sort -k 2 -n -r | head -1 | awk '{print $1}'"

我还尝试使用 ths 门户上以前的问题中的建议将完整的命令括在单引号中,将 awk 括在双引号中,但这对我来说是错误的,因为 printf 语句中的双引号被解释为 awk 的外部双引号的结束。

答案1

问题在于引用。

使用echo而不是ssh查看将传输到 ssh 服务器的内容:

$ echo "for file in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " " $3} END{print ""}' $file; done | sort -k 2 -n -r | head -1 | awk '{print $1}'"
for file in /proc/*/status; do awk '/VmSwap|Name/{printf    } END{print }' ; done | sort -k 2 -n -r | head -1 | awk '{print }'

您会看到外壳膨胀了$1$2并且$3。在交互式 shell 中,这些很可能是空字符串。替换$为可能就足够了\$,我没有测试它。

一般来说,我更喜欢在标准输入上发送命令,显然如果您需要标准输入,这不起作用。另一个优点是您可以将其格式化为多行。

cat << 'EOF' |
for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf $2 " " $3} END{print ""}' $file
done | sort -k 2 -n -r | head -1 | awk '{print $1}'
EOF
ssh someserver /bin/sh

相关内容