我需要获取远程服务器上哪个进程使用最多交换空间的结果。我正在使用下面的命令,如果我登录到远程并运行它,它可以正常工作,但如果我使用 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