成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何對(duì)一個(gè)可執(zhí)行程序進(jìn)行攔截和包裝?

系統(tǒng) Linux
Ubuntu 18.04操作系統(tǒng)中,重啟指令/sbin/reboot是一個(gè)軟鏈接,鏈接到可執(zhí)行程序/bin/systemctl,那么是否可以在執(zhí)行systemctl之前,做一些其它的事情(例如:保持一些應(yīng)用程序的狀態(tài)數(shù)據(jù))?

文中一共討論了3種方法,來(lái)實(shí)現(xiàn)對(duì)【函數(shù)】進(jìn)行攔截:

  • 在編譯階段插樁;
  • 在鏈接階段插樁;
  • 在執(zhí)行階段插樁;

昨天一個(gè)網(wǎng)友提了另外一個(gè)問(wèn)題:如何對(duì)一個(gè)可執(zhí)行程序進(jìn)行攔截?

他提出了一個(gè)實(shí)際的示例:

Ubuntu 18.04操作系統(tǒng)中,重啟指令/sbin/reboot是一個(gè)軟鏈接,鏈接到可執(zhí)行程序/bin/systemctl,那么是否可以在執(zhí)行systemctl之前,做一些其它的事情(例如:保持一些應(yīng)用程序的狀態(tài)數(shù)據(jù))?

  • Ubuntn18.04 中使用 systemd 來(lái)管理系統(tǒng)的所有 Service;
  • 除了 reboot 指令,還有其它幾個(gè)指令也是軟鏈接到 /bin/systemctl;

圖片

這里就引出一個(gè)問(wèn)題了:

既然上面這6個(gè)命令都鏈接到systemctl,那么當(dāng)systemctl被執(zhí)行的時(shí)候,它是如何知道它是被哪一個(gè)命令調(diào)用的呢?

看一下源碼就知道了:通過(guò)參數(shù) argv[0] 來(lái)獲得的。

我們知道,main函數(shù)通過(guò)argc和argv[]來(lái)獲取所有的參數(shù),如下:

// 測(cè)試文件:test1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
printf("argc = %d \n", argc);
for (int i = 0; i < argc; i++)
printf("argv[%d] = %s \n", i, argv[i]);
return 0;
}

編譯、執(zhí)行一下:

$ gcc test1.c -o test1
$ ./test1 aaa bbb
argc = 3
argv[0] = ./test1
argv[1] = aaa
argv[2] = bbb

可以看到:argv[0] = ./test1,因?yàn)槲覀兪窃诿钚兄苯诱{(diào)用test可執(zhí)行程序的,這很容易理解。

那么:如果test是被一個(gè)軟鏈接調(diào)用的呢?

測(cè)試一下,創(chuàng)建軟鏈接:

$ ln -s test1 link1

圖片

執(zhí)行一下:

圖片

此時(shí),argv[0] = ./link1。

也就是說(shuō):第一個(gè)參數(shù)存放的是軟鏈接文件路徑,systemctl 的道理也是如此!

知道了這個(gè)原理,那我們就可以在reboot與systemc之間橫叉一刀,增加一個(gè)中間可執(zhí)行文件:

圖片

為了便于描述,我們把這個(gè)中間文件創(chuàng)建為腳本pre_systemctl.sh,然后把root軟鏈接到這個(gè)腳本。

注意:在理解原理之前,建議不要直接用 reboot 等系統(tǒng)命令進(jìn)行操作,可以自己寫一些測(cè)試程序,例如上面的 test。

操作如下:

$ cd /sbin
$ sudo rm root
$ sudo touch pre_systemctl.sh
$ sudo chmod +x pre_systemctl.sh
$ sudo ln -s pre_systemctl.sh reboot

圖片

創(chuàng)建了pre_systemctl.sh腳本之后,并且把reboot軟鏈接到它,在腳本中輸入如下內(nèi)容:

圖片

此時(shí),在命令行中執(zhí)行reboot命令,就會(huì)執(zhí)行這個(gè)腳本,并且這個(gè)腳本也能夠正確的把/sbin/root作為第0個(gè)參數(shù)傳遞給/bin/systemctl,如下圖所示:

圖片

在這個(gè)腳本中,可以在執(zhí)行systemctl之前,做任何需要關(guān)機(jī)前需要處理的一些事情。

問(wèn)題似乎是解決了,但是好像還有一個(gè)問(wèn)題:

如果用戶在執(zhí)行命令時(shí)輸入了一些其它的參數(shù),這個(gè)腳本程序也應(yīng)該透明的把這些參數(shù)傳遞給 systemctl 才可以!

為了便于觀察,我們?cè)谀_本中多打印個(gè)參數(shù),并通過(guò)exec來(lái)啟動(dòng)systemctl,并且強(qiáng)制把參數(shù)$0設(shè)置為systemctl的第0個(gè)參數(shù):

圖片

這個(gè)腳本文件中的重點(diǎn)是最后一條命令:

exec -a $0 /bin/systemctl $*

此時(shí),在命令行中執(zhí)行reboot指令,輸出如下:

圖片

如此調(diào)用systemctl,就解決了剛才提出的問(wèn)題,而且通過(guò) $*,可以把任意多個(gè)參數(shù)透明的傳遞下去。

這里的關(guān)鍵還是 exec 的參數(shù) -a ,看一下它的指令說(shuō)明:

exec [-cl] [-a name] [command [arguments ...]] [redirection ...]

這里還有一個(gè)更詳細(xì)的說(shuō)明:

圖片

責(zé)任編輯:武曉燕 來(lái)源: IOT物聯(lián)網(wǎng)小鎮(zhèn)
相關(guān)推薦

2022-01-11 09:59:23

Python關(guān)機(jī)程序文件

2009-09-04 09:36:17

Java調(diào)用

2021-08-12 09:17:18

WFH漏洞劫持攻擊

2010-03-23 10:29:28

Python程序編譯轉(zhuǎn)

2010-03-26 14:49:04

Python腳本

2024-03-08 09:34:35

JpackageJarJava

2023-12-14 14:32:00

物聯(lián)網(wǎng)人工智能邊緣計(jì)算

2010-09-09 21:34:06

2010-02-24 15:41:53

Python解釋器

2010-01-15 17:18:57

C++源程序

2022-12-13 07:40:33

LinuxWeb服務(wù)器

2018-01-31 08:03:30

2009-10-28 13:03:54

2010-02-26 13:03:31

Python腳本語(yǔ)言

2012-01-09 17:45:48

Java程序員

2010-10-12 16:26:44

2018-07-23 08:45:00

程序員能力水平

2022-02-04 22:05:19

JVM程序內(nèi)存模型

2011-11-17 10:34:44

并行程序

2017-12-12 14:08:48

Unix命令maybe
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日日夜夜天天 | 欧美视频在线播放 | 欧美日韩国产在线观看 | 国产精品三级久久久久久电影 | 中文字幕 国产精品 | 91麻豆蜜桃一区二区三区 | 国产日韩免费视频 | 成人毛片网 | 国产精品一区久久久久 | 欧美黑人一区二区三区 | 丝袜 亚洲 欧美 日韩 综合 | 一区二区三区四区在线 | 久久成人精品 | 国产精品99久久久久久动医院 | 国产在线一区二区三区 | 久久大陆 | 91原创视频| 成人免费淫片aa视频免费 | 国产一级片免费视频 | 久草在线 | 91高清在线 | 国产 日韩 欧美 在线 | 欧美在线观看免费观看视频 | 国产欧美精品一区二区色综合朱莉 | 91夜夜夜| 午夜影视网| 成人欧美一区二区三区色青冈 | 欧美在线视频网站 | 国产精品91久久久久久 | 91色视频在线| 羞羞网站在线观看 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 亚洲人成在线播放 | 成年人视频在线免费观看 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 亚洲高清免费观看 | 日本不卡高字幕在线2019 | 91激情视频 | 蜜桃视频一区二区三区 | 欧美精品v国产精品v日韩精品 | 亚洲高清在线播放 |