จะใช้โปรแกรม C เพื่อรันคำสั่งบนเทอร์มินัลได้อย่างไร?


11

ฉันต้องการสร้างโปรแกรมในภาษา C ที่จะอนุญาตให้ฉันเรียกใช้คำสั่งในเทอร์มินัล

ฉันได้สร้างโปรแกรมในเชลล์สคริปต์ซึ่งจะทำให้ฉันมี ip ของเว็บไซต์ใด ๆ ที่เปิดในเบราว์เซอร์ของฉัน เชลล์สคริปต์นี้ทำงานโดยป้อนคำสั่งนี้ในเทอร์มินัล:

sudo tcpdump -n dst port 80 -i eth

อาจารย์ของฉันบอกให้ฉันสร้างโปรแกรมในภาษา C ซึ่งจะเปิดเทอร์มินัลและป้อนคำสั่งนี้จากนั้นสคริปต์เชลล์ของฉันก็จะทำงานได้

กรุณาบอกวิธีการสร้างโปรแกรมดังกล่าว

คำตอบ:


8

คุณสามารถใช้ฟังก์ชันsystem () ที่มีอยู่ในstdlib.hเพื่อเรียกใช้คำสั่ง

รายละเอียด

ระบบ () รันคำสั่งที่ระบุในสตริงโดยการโทร / bin / sh -c สตริงและส่งกลับหลังจากคำสั่งเสร็จสมบูรณ์ ระหว่างการดำเนินการคำสั่ง SIGCHLD จะถูกบล็อกและ SIGINT และ SIGQUIT จะถูกละเว้น

คุณสามารถอ่านเพิ่มเติมได้ที่นี่http://linux.about.com/library/cmd/blcmdl3_system.htm


นี่เป็นวิธีหนึ่งอย่างแน่นอน แต่คุณอาจไม่ต้องการเรียกใช้คำสั่งจากโปรแกรม ac แทนโปรแกรม Linux ส่วนใหญ่มี lib ที่สามารถใช้รหัสโปรแกรมได้โดยตรง ยกตัวอย่างเช่น SSH สามารถใช้libssh มักจะมีเหตุผลที่ จำกัด มากในการเรียกใช้คำสั่งระบบจากรหัส หากคุณไปมากคุณเกือบจะทำอะไรผิด
coteyr

ฉันทำโปรแกรมใน C เช่นนี้
Tehseen Malik

4

สวัสดีฉันจะเขียนโค้ดให้คุณอธิบายให้คุณและหวังว่านี่จะช่วยคุณได้ ต้นแบบของฟังก์ชั่นมีลักษณะดังนี้:

ระบบ int (const char * cmd);

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CMN_LEN 100

int main(int argc, char *argv[])
{
    char cmd[MAX_CMN_LEN] = "", **p;

    if (argc < 2) /*no command specified*/
    {
        fprintf(stderr, "Usage: ./program_name terminal_command ...");
        exit(EXIT_FAILURE);
    }
    else
    {
        strcat(cmd, argv[1]);
        for (p = &argv[2]; *p; p++)
        {
            strcat(cmd, " ");
            strcat(cmd, *p);
        }
        system(cmd);
    }

    return 0;
}

1) เปิดเทอร์มินัลและรวบรวมโปรแกรม

2) เรียกใช้ (ตัวอย่างเช่นใน Ubuntu) ./program_name comman_name - ทุกอย่าง - อะไรก็ได้

ตัวอย่าง: ./a.out locale -a

ตัวอย่างนี้พิมพ์โลแคลทั้งหมดที่คอมไพเลอร์ของฉันรองรับซึ่งเป็น gcc

ข้อมูลเพิ่มเติม:

p เป็น poniter ไปยังตัวชี้ไปยัง char (เช่น argv is) p = & argv [2], ชี้ไปที่ - ทุกสิ่งที่สตริง cat แมวทั้งหมด - สิ่งเหล่านี้ไปยังสตริง cmd ของฉันฉันออกจากลูปเมื่อ * p ชี้ไปที่ค่า NULL ที่นี่: -> ฉันจะใช้สัญลักษณ์นี้เพื่อบอกว่าชี้ไปที่ (อย่าสับสนกับตัวเลือกลูกศรขวา)

argv [0] -> program_name

argv [1] -> command_name (ในชื่อคำสั่งตัวอย่างนี้จะเป็นสถานที่ แต่ป้อนคำสั่งที่คุณต้องการตรวจสอบแทน)

argv [2] -> - ทุกอย่าง (ในตัวอย่างนี้ -a ซึ่งเป็นตำแหน่งที่ตั้งทั้งหมด)

argv [3] -> NULL (ในตัวอย่างนี้จะออกจากลูป)

ตกลงฉันคิดว่า


ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้สิ่งนี้เป็นไฟล์ปฏิบัติการ setuid เนื่องจากมีช่องโหว่บัฟเฟอร์ล้นอย่างชัดเจน
Martin

0

ฉันจะสมมติว่านี่เป็นเรื่องเกี่ยวกับการใช้ setuid-root binary เพื่อแทนที่ sudo แทนที่จะเป็นเพียงการประมวลผลคำสั่งตามอำเภอใจดังนั้นฉันจะรวมส่วนอื่น ๆ ของโซลูชัน

ในฐานะที่เป็นเรื่องความปลอดภัยเราหลีกเลี่ยงระบบ () เพราะสามารถถูกขโมยได้

หลังจากรวบรวมสิ่งนี้แล้วให้ติดตั้งไบนารีผลลัพธ์เป็น setuid-root

#include <unistd.h>
#include <stdio.h>
#include <sysexits.h>

int หลัก (int argc, ถ่าน ** argv) {
    if (argc> 2) {fputs ("args มากเกินไป \ n", stderr); ส่งคืน EX_USAGE }
    if (argc> 1 && argv [1] [0] == '-') {fputs ("ไม่มีตัวเลือกที่อนุญาต \ n", stderr); ส่งคืน EX_USAGE }
    if (geteuid ()! = 0) {fputs ("ติดตั้งไม่ถูกต้องเหมือน setuid-root \ n", stderr); ส่งคืน EX_UNAVAILABLE; }
    ถ้า (setuid (0) 1) p [6] = argv [1];

    / * ถ้าทุกอย่างเป็นไปด้วยดี execv จะไม่กลับมา
     * (เพราะโปรแกรมนี้จะถูกแทนที่ด้วย tcpdump) * /
    execv (p0, p);
    / * ถ้าเราไปถึงที่นี่แล้ว execv จะต้องล้มเหลว * /

    pError (p0);
    ส่งคืน EX_OSFILE;
}

หากคุณบันทึกสิ่งนี้เป็นfoo.cและต้องการให้ติดตั้งเป็น/usr/local/sbin/fooรัน:

ทำให้ foo && ติดตั้ง -o root -m 4511 foo / usr / local / sbin / foo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.