通过 ssh 的复杂命令

complex command over ssh

谁能帮我强制这个脚本工作

IFLOAD=`ssh root@$REMOTE_HOST 'awk '\''/$IFACE/ {i++; rx[i]=$2; tx[i]=$10}; END{print rx[2]-rx[1] " " tx[2]-tx[1]}'\'' <(cat /proc/net/dev; sleep 1; cat /proc/net/dev)'
echo "$IFLOAD"

现在returns

0 0

但是在 $2 和 $10 列上,我有一个带有 IFACE rx 和 tx 字节的真实数据。如我所见,没有 ssh 这个脚本工作正常。

或者您可能知道通过 ssh 获取当前界面负载的更简单方法。

首先,让我们稍微简化一下 awk 命令,然后再考虑如何通过 ssh 传递它。

awk_script='
  ifc ~  {
     i++;
     rx[i]=;
     tx[i]=
    };
  END { 
     print rx[2]-rx[1] " " tx[2] - tx[1]
  }
'
awk -v ifc="$IFACE" "$awk_script" <(cat /proc/dev/net; sleep 1; cat /proc/dev/net)

IFACE 作为 awk 变量传递,让我们可以将整个 awk 脚本包含在一个单引号字符串中。只要我们双引号扩展,它就会按预期工作。

现在通过ssh发送应该比较简单:

IFLOAD=$(ssh root@$REMOTE_HOST "awk -v ifc='$IFACE' '$awk_script' <(cat /proc/dev/net; sleep 1; cat /proc/dev/net)")

注意整个命令行是一个双引号字符串。这意味着 $IFACE$awk_script 将在 本地扩展 。但是,该字符串在扩展周围使用单引号,因此当整个内容发送到远程 shell 时,每个值都被视为单引号字符串,并且不会被远程错误处理shell.