我正试图通过以下方式从Axis嵌入式Linux产品控制Kasa Smartplug:https://blog.georgovassilis.com/2016/05/07/controlling-the-tp-link-hs100-wi-fi-smart-plug/我已经设法从Axis框打开和关闭了插头,但我在查询Smartplug的打开/关闭状态时遇到了麻烦,因为我没有od(或hd、hexdump或xxd(,而且Smartplug输出是二进制的。实现这一点的George代码片段是:
decode(){
code=171
input_num=`od $ODOPTS`
IFS=' ' read -r -a array <<< "$input_num"
args_for_printf=""
for element in "${array[@]}"
do
output=$(( $element ^ $code ))
args_for_printf="$args_for_printfx$(printf %x $output)"
code=$element
done
printf "$args_for_printf"
}
有没有一种方法可以使用基本的shell命令而不是od来实现这一点?Axis盒子说它是Linux 2.6.29在crisv32上大约30年前我曾经使用Unix,所以我很挣扎。。。
Linux shell中的八进制转储,不带od或hd
使用awk
似乎很简单。借用这个答案中的代码并从这个答案中分离,很简单:
awk -v ORS='' -v OFS='' 'BEGIN{ for(n=0;n<256;n++)ord[sprintf("%c",n)]=n }
{ split($0, chars, "");
chars[length($0)+1]=RS; # add the newline to output. One could check if RS is empty.
# and print
for (i=1;i<=length($0)+1;++i) printf("%on", ord[chars[i]]) }'
我最终解决了这个问题:我无法仅使用目标机器上可用的shell命令来复制od,所以我创建了一个非常简单的C程序来读取二进制文件中的每个字节,并将其打印为可读字符。这包括复制奇怪的XOR,这似乎与基本加密有关(可能(。然后我使用sed提取出我需要的值。在我的Lubuntu机器上为目标CRIS架构交叉编译这个C对于一个简单的程序来说并不太困难。一旦我把模型代码简化为一个最小的可重复示例,一切都变得容易多了。谢谢大家。