鍍金池/ 問答/C  Linux  網絡安全/ linux中函數(shù)execl一直無法調用成功,如何正確地傳參數(shù)?

linux中函數(shù)execl一直無法調用成功,如何正確地傳參數(shù)?

1.在linux環(huán)境下,調用execl:

if((pid=fork())<0){
            printf("fork error\n");
        }else if(pid==0){  /*child*/
            if(execl("/sbin/ifconfig","ifconfig","eth0","hw","ether",eth0_num,NULL)<0){
                exit(1);
            }else{
                exit(0);        
            }    
}

2.其中eth0_num變量是另一個函數(shù)調用返回的,是一個指針:

函數(shù)調用原型:int read_data(int addr,char* data,int len)
實際調用方式:read_data(4, eth0_num,6);/*從地址4,讀6個字節(jié),到eth0_num*/

3.但是運行的時候回報錯:

ifconfig: invalid hw-addr 

4.我打印eth0_num的值是:0x7e8b8bf4

打印*eth0_num,*(eth0_num+1),*(eth0_num+2)的值是: 00  90  8f

值沒錯,但是一直行不通,我試過另一種方式
直接復制char *eth0_num="1eed19271ab3";然后調用execl,不使用從函數(shù)調用read_data的參數(shù),就能ifconfig成功

5.各位給個意見,看如何才能通過傳變量參數(shù)的方式,因為我需要從其他地方讀值回來

回答
編輯回答
笑浮塵

execl() 的參數(shù)是 char* 類型,你應該把網卡地址的 6 字節(jié)轉換成字符串。

比如你讀取的 6 字節(jié)是 00 01 02 03 04 05 ,要轉換成 "00:01:02:03:04:05" 。

參考代碼

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

void read_data(char* data)
{
    // 模擬網卡地址 00 01 02 03 04 05
    unsigned char source[6] = { 0, 1, 2, 3, 4, 5 };
    memcpy(data, source, 6);
}

int main()
{
    pid_t pid;
    char macBin[6];  // 字節(jié):00 01 02 03 04 05 06
    char macHex[18];  // 16進制字符串: "00:01:02:03:04:05"

    read_data(macBin);
    // 將 6 字節(jié)轉換成 16 進制字符串
    snprintf(macHex, sizeof(macHex),
            "%02X:%02X:%02X:%02X:%02X:%02X",
            macBin[0],
            macBin[1],
            macBin[2],
            macBin[3],
            macBin[4],
            macBin[5]);

    if ((pid = fork()) == -1) {
        perror(NULL);
    } else if (pid == 0) {
        execl("/usr/bin/ip", "ip", "link", "set", "eth0", "address", macHex, NULL);
        perror(NULL);
    }
}

順便提一下,用 ip 工具代替 ifconfig 吧。

2017年10月7日 13:04