簡體   English   中英

Linux shell 中的八進制轉儲,沒有 od 或 hd

[英]Octal dump in Linux shell without od or hd

我正在嘗試按照 George Georgovassilis 在此處所做的操作從 Axis 嵌入式 Linux 產品中控制 Kasa Smartplug: https://blog.georgovassilis.com/2016/05/07/controlling-the-tp-link-h wi-fi-smart-plug/我已經設法從 Axis 盒子打開和關閉插頭,但我在嘗試查詢 Smartplug 的開/關狀態時遇到了困難,因為我沒有 od(或 hd , hexdump 或 xxd) 和 Smartplug output 是二進制的。 執行此操作的 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_printf\x$(printf %x $output)"
        code=$element
    done
    printf "$args_for_printf"
 }

有沒有辦法我可以使用基本的 shell 命令而不是使用 od 來做到這一點? Axis 盒子說它是 crisv32 上的 Linux 2.6.29 我大約 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("%o\n", ord[chars[i]]) }'

我最終設法解決了這個問題:我無法弄清楚如何僅使用目標機器上可用的 shell 命令來復制 od,因此我創建了一個非常簡單的 C 程序來讀取二進制文件中的每個字節並將其打印為一個可讀的字符。 這包括復制奇怪的 XOR,這似乎與基本加密有關(可能)。 然后我使用 sed 提取了我需要的值。 在我的 Lubuntu 機器上為目標 CRIS 架構交叉編譯這個 C 對於一個簡單的程序來說並不太難。 一旦我將 model 代碼簡化為我自己的最小可重現示例,一切都會變得容易得多。 謝謝大家。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM