linux - 如何使用 "sed"Bash 命令

标签 linux bash shell sed

我很难用 bash 文件中的变量内容替换 c 程序文件中的字符串。思路是复制Linux内核sys_call_table的地址,然后在我的C程序中使用它来拦截系统调用。我在网上找到了几个例子,但到目前为止,没有一个对我有用。因此,我们将不胜感激任何帮助。

这是我的 bash 文件“bashFile.sh”的内容

    TABLE=$(grep sys_call_table /boot/System.map-$(uname -r) |awk '{print $1}')
    sed -i "s/myTABLE/{$TABLE}/g" my_LKM.c

当我运行“sudo sh bashFile.sh”命令时,没有任何反应。 C 文件中的字符串 myTable 不会被替换。但是,当我尝试以下变体时:

    TABLE=$(grep sys_call_table /boot/System.map-$(uname -r) |awk '{print $1}')
    sed -i 's/myTABLE/{$TABLE}/g' my_LKM.c

myTABLE 字符串被替换为 {$TABLE} 而不是变量 TABLE 的内容(sys_call_table 地址)。我尝试使用“echo $TABLE”进行调试以查看 TABLE 内容是否是 sys_call_table 的地址并且它有效。因此,我得出结论,问题可能出在 sed 命令的语法上。但是,我现在不知道如何修复它。预先感谢您的帮助。

附言以下是 myLKM.c 文件的内容:

    unsigned long *sys_call_table;  
    sys_call_table = (unsigned long *)myTABLE;

最佳答案

首先,不要使用 sudo 来运行它。它不会神奇地使事情起作用。如果您需要 root 权限来编辑您正在处理的源代码,那么您的开发设置就会出现严重问题。


如果您希望内容在其中展开,请使用双引号。例如

TABLE=$(awk '/sys_call_table/ {print $1}' /boot/System.map-$(uname -r))
sed -i "s/myTABLE/${TABLE}UL/g" my_LKM.c

正如 karakfa 所建议的,请确保您首先在没有 -i 的情况下尝试此操作。不过,他的另一个建议是在不加引号的上下文中扩展 $TABLE,而不是在双引号内,这很糟糕。您需要整个字符串成为同一个 sed arg 的一部分,所以只结束单引号是不好的。

此外,我猜他将 {$TABLE} 误读为 ${TABLE},并简化为 $TABLE。或者实际上,从您的问题的上下文来看,您似乎想要一个普通的数字常量,而不是用大括号括起来。所以你应该使用 $TABLE

实际上,您应该使用 ${TABLE}UL 所以它是一个无符号长整数文字。如果没有这些修饰符,不适合 low32 的地址可能会在应用转换为指针类型之前被破坏。

关于linux - 如何使用 "sed"Bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33663218/

相关文章:

c++ - linux 终端中的进度条

c - 在哪里可以找到从 C 程序运行 Find/Sed 留下的日志

linux - 在没有窗口管理器的情况下编写 GTK+ 应用程序?

linux - 如何在从文件读取的配置单元查询中传递变量作为表名

bash - 如何制作 "if not true condition"?

显示系统物理 IP 的 linux 命令

bash - 可能的攻击 : echo -e

c - 如何使用 C 列出目录中除 "."和 ".."之外的文件夹?

linux - 如何使用不同的变量循环 shell 脚本,用变量存储脚本的全部内容,然后运行另一个函数

bash - 是否可以将 UNIX 套接字作为 STDIN 附加到 bash 中进行处理?