【问题标题】:Linux shell: write IP to binary fileLinux shell:将IP写入二进制文件
【发布时间】:2014-08-15 23:29:06
【问题描述】:

使用 ash,我有一个 IP 地址作为变量

IP_ADDR=192.168.1.234

我想将这 4 个字节写入二进制文件,然后重新读取它们并重新调整 IP 字符串。

我有以下可行的解决方案,但它似乎很老套 - 有更好的建议吗?

写:

 IP_ADDR=192.168.1.234
 serialHex=`printf '%02X' ${IP_ADDR//./ } | sed s/'\(..\)'/'\\\\x\1'/g`
 echo -n -e $serialHex | dd bs=1 of=/path/to/file seek=19 &> /dev/null

注意 seek=19 表示在二进制文件(字节 19)中写入的位置

阅读:

hexValues=`od -j 19 --read-bytes=4 --address-radix=n -t x1 /path/to/file` 
set $hexValues
for w; do echo -n "$((0x$w))."; done | sed s/.$//

【问题讨论】:

  • "Note seek=19...' -- 你今天不在乎,但如果你希望 C 程序读取这个文件,那么你应提前计划并将此 32 位值与 32 位对齐(例如使用字节偏移 20)对齐。多字节二进制数据应对齐以方便读取数据结构,尤其是在 RISC 拱门上。

标签: linux shell ip busybox ash


【解决方案1】:
function ip_write {
    local FILE=$1 IP=$2 NUMS T
    IFS=. read -a NUMS <<< "$IP" 
    printf -v T '\\x%x\\x%x\\x%x\\x%x' "${NUMS[@]}"
    printf "$T" > "$FILE"
}

function ip_read {
    local FILE=$1 NUMS
    read -a NUMS < <(exec od -N4 -An -tu1 "$FILE")
    local IFS=.
    IP="${NUMS[*]}"
}

示例用法:

# Saves IP to file:
> ip_write ip.txt 10.0.0.1
> hexdump -C ip.txt
00000000  0a 00 00 01                                       |....|

# Reads IP from file:
> ip_read ip.txt
> echo "$IP"
10.0.0.1

【讨论】:

  • 这似乎在灰中不起作用。我试图修复,但它在 ip_write() 中的第一个 printf 上给了我“语法错误:错误替换”。另外,如何在二进制文件中的特定位置写入?
  • 确保使用 Bash 运行脚本:bash script.sh。请不要将 Bash 与 Shell 本身混淆。 Bash 是具有更多功能的 sh 变体。我不确定如何在二进制文件的特定位置上做到这一点,但这不再是您问题的背景,所以也许最好再问另一个问题。
  • 介意我问你使用的是什么版本的 Bash? (bash --version)
  • 我正在运行(busybox 的)灰。没有狂欢。如果我得到了错误的替换,我可以通过管道进入 dd (就像我的原始代码一样)
  • 它只适用于 Bash。下次请使用正确的标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2017-10-11
相关资源
最近更新 更多