如何使用“sed”Bash命令

时间:2015-11-12 02:04:37

标签: 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命令的语法。但是,我现在还不知道如何修复它。提前感谢您的帮助。

P.S。以下是myLKM.c文件的内容:

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

2 个答案:

答案 0 :(得分:1)

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

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

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的地址可能会被破坏。

答案 1 :(得分:0)

你必须逃避引号

sed -i 's/myTABLE/'$TABLE'/g' my_LKM.c

显然首先尝试不到位(删除-i