簡體   English   中英

如何使用“ sed” Bash命令

[英]How to Use “sed” Bash Command

我在用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命令的語法上。 但是,我目前不知道如何解決。 預先感謝您的幫助。

PS下面是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

實際上,您應該使用${TABLE}UL因此它是一個無符號長整數整數。 如果沒有這些修飾符,則在應用指針類型的轉換之前,可能不適合low32的地址被弄亂了。

您必須轉義報價

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

顯然首先嘗試不就地(刪除-i

暫無
暫無

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

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