当我进入服务器并运行命令时,它可以工作:
$ssh -q postgres@XXXXX
Last login: Mon Mar 12 12:30:16 2018 from 10.101.XXX.X
[postgres@pgsdba203 ~]$ df -hP | grep pgsql | awk '{ if ($5 >= 70) print $0 }'
/dev/mapper/pgvg-pg_log 9.9G 7.2G 2.2G 77% /var/lib/pgsql/data/pg_log
但不是当它是ssh命令参数的一部分时:
$ ssh -q postgres@XXXXX "df -hP | grep pgsql | awk '{ if ($5 >= 70) print $0 }'"
awk: { if ( >= 70) print -bash }
awk: ^ syntax error
由于awk命令是单引号,我原本期望保留$5
并直接传递给服务器XXXXX。
编辑:最终目标是将服务器名称变为变量并从bash for循环中调用ssh。
答案 0 :(得分:1)
我会做什么:
ssh -q postgres@XXXXX <<'EOF'
df -hP | awk '/pgsql/ && $5 >= 70'
EOF
或 for循环
for server in foo bar base; do
ssh -q postgres@$server <<'EOF'
df -hP | awk '/pgsql/ && $5 >= 70'
EOF
done
答案 1 :(得分:0)
作为一个易于定义的模式,即使你需要将stdin管道输入远程代码也能工作:定义一个shell函数,告诉shell本身发出该函数&#39; s文本文本替换为远程命令:
myfunc() { df -hP | grep pgsql | awk '{ if ($5 >= 70) print $0 }'; }
ssh -q postgres@XXXX "$(declare -f myfunc); myfunc"