ssh上的复杂命令

时间:2017-10-19 21:08:30

标签: linux bash ssh centos7

有人可以帮我强迫这个脚本工作吗

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"

现在它返回

0 0

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

或许您可以通过ssh获得更简单的方法来获取当前的交互负载量。

1 个答案:

答案 0 :(得分:1)

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

awk_script='
  ifc ~ $1 {
     i++;
     rx[i]=$2;
     tx[i]=$10
    };
  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错误地处理。