【问题标题】:complex command over ssh [closed]ssh上的复杂命令[关闭]
【发布时间】:2017-10-19 21:08:29
【问题描述】:

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

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 获取当前接口负载测量的更简单方法。

【问题讨论】:

    标签: linux bash ssh centos7


    【解决方案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 错误地处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-23
      • 2013-07-14
      • 2015-12-18
      • 1970-01-01
      • 2011-06-11
      • 2015-08-27
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多