【问题标题】: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 错误地处理。