আমি কীভাবে লিনাক্সে সমস্ত প্রক্রিয়া প্রবর্তন লগ করতে পারি?


55

আমি যে সমস্ত প্রক্রিয়াগুলি চালু হয়েছিল তার সময় এবং তারা যে যুক্তি দিয়ে শুরু হয়েছিল তা দিয়ে একটি লগ পেতে চাই। লিনাক্স এ কি সম্ভব?

উত্তর:


43

আপনার শুরুর পয়েন্টটি নিরীক্ষণ করা উচিত।

এরকম কিছু চেষ্টা করুন:

apt-get install auditd
auditctl -a task,always
ausearch -i -sc execve

1
আমি ত্রুটি পাচ্ছি আমি The audit system is disabledকোথায় এটি সক্ষম করতে পারি?
টম্বার্ট

1
ভাল একটি সমস্যার সমাধান হতে পারে chmod 0750 /sbin/audispdতবে এটি এখনও কাজ করছে না (ডিবিয়ান হুইজি)
টম্বার্ট

বলা আছে Unable to set audit pid, exitingতবে আমি অনুমান করি যে আসল সমস্যাটি হ'ল সিস্টেমটি
এলএক্সসি

সিস্টেমড জার্নাল্ডের সাথে নিরীক্ষণ কীভাবে সংহত হয়? তাদের কাজগুলি কি ওভারল্যাপ করে?
সিএমসিডিগ্রাগনকাই

আমি এটি একটি লাইভ সার্ভারে চেষ্টা করেছি এবং কার্যকরভাবে আমি এটি হত্যা করেছি, প্রায় প্রতিক্রিয়াহীন হয়ে পড়েছি। আমি সবেমাত্র এই নিয়ম সরিয়ে সার্ভারটিকে পুনরায় প্রতিক্রিয়াযুক্ত করতে সক্ষম হয়েছি
শোকার

10

আমার এটি করার দরকার ছিল, (১) আমার সময় প্রয়োজন হয়নি এবং (২) আমি কেবল প্রদত্ত প্রক্রিয়া এবং এর শিশু এবং পরবর্তী বংশধরদের মধ্যেই আগ্রহী ছিলাম in এছাড়াও, আমি যে পরিবেশটি ব্যবহার করছিলাম, এটি পাওয়া সম্ভব ছিল না auditdবা ছিল accton, কিন্তু ছিল valgrind

কমান্ড লাইনে আগ্রহের প্রক্রিয়াটির জন্য নিম্নলিখিতটি উপসর্গ করুন:

valgrind --trace-children=yes

আপনার প্রয়োজনীয় তথ্যটি এসটিডিআরআর প্রদর্শিত লগ আউটপুটে থাকবে।


3
ডিফল্টরূপে, ভালগ্রাইন্ড memcheckসরঞ্জামটি দিয়ে চলে। টুল এবং তার সংশ্লিষ্ট লগিং অক্ষম করতে, এবং শুধুমাত্র নতুন কমান্ড সৃষ্টির মুদ্রণ (আপনার প্রোগ্রাম স্বাভাবিক আউটপুট ছাড়াও), নিম্নলিখিত কমান্ড পরিবর্তে ব্যবহার করুন: valgrind --tool=none --trace-children=yes [command and args here]। যখনই একটি উপ-প্রসেস তৈরি হয়, ভালগ্রাইন্ড তারপরে আর্গুমেন্টগুলি সহ সম্পূর্ণ কমান্ডটি লগ করে।
রব ডাব্লু

6

আপনি এটির জন্য স্নোপি ব্যবহার করতে পারেন ।

এটি ইনস্টল করা খুব সহজ, এবং ২.x থেকে এটি নির্বিচারে ডেটা লগ করতে পারে (আর্গুমেন্ট, পরিবেশগত পরিবর্তনশীল, সিডাব্লুড ইত্যাদি)।

প্রকাশ: স্নোপি রক্ষণাবেক্ষণকারী এখানে।


2

আপনি স্টার্টমন চালাতে এবং এর স্ট্যান্ডার্ড আউটপুট, সিটিআরএল-সিটি হয়ে গেলে তা অনুসরণ করতে পারেন। সাম্প্রতিক রেড হ্যাট থেকে প্রাপ্ত ডিগ্রোস (আরএইচইএল, ফেডোরা, সেন্টোস) এর স্টার্টমন সংকলন এবং চালনা করার পদ্ধতি এখানে রয়েছে:

sudo yum install git cmake gcc-c++
git clone https://github.com/pturmel/startmon
cd startmon
cmake .
make
sudo ./startmon -e

ডেবিয়ান (এবং উবুন্টু ইত্যাদি) এ, উপরের প্রথম লাইনটি এতে পরিবর্তন করে:

sudo apt-get install git cmake g++

বিকল্পভাবে আপনি execsnoopপারফেক্ট-সরঞ্জামগুলিতে স্ক্রিপ্টটি চেষ্টা করতে পারেন , এই উত্তরটি দেখুন । ডিফল্টরূপে কেবল প্রথম 8 টি আর্গুমেন্ট প্রদর্শিত হয় (9 টি প্রোগ্রামের নাম সহ); আপনি এটি মাধ্যমে বৃদ্ধি করতে পারেন

sudo ./execsnoop -a 16

যদি আপনার সিস্টেমে রুট অ্যাক্সেস না থাকে তবে আপনি সবচেয়ে ভাল করতে পারেন ভোটদান চালিয়ে যাওয়া /procএবং আশা করি এটি সমস্ত কিছু ধরে ফেলবে (যা এটি হবে না) তবে সম্পূর্ণতার জন্য এটি করার জন্য এখানে একটি স্ক্রিপ্ট রয়েছে (আমি নকল-অপসারণ রেখেছি আউটপুটকে সহজতর করার জন্য) - উপরোক্ত পদ্ধতির একটি হিসাবে এটি যথাযথভাবে ট্র্যাক করার মতো ভাল নয়, কমান্ড-লাইন আর্গুমেন্টগুলির মধ্যে দ্ব্যর্থহীনভাবে বিভাজক প্রদর্শন করার সামান্য সুবিধা রয়েছে, যদি আপনাকে কখনও বলার দরকার হয় তবে শূণ্যস্থান মধ্যে পার্থক্য ভিতরে একটি আর্গুমেন্ট এবং স্থান মধ্যে আর্গুমেন্ট। এই স্ক্রিপ্টটি অকার্যকর কারণ এটি সিপিইউ (ভাল, এর অন্যতম কোর) 100% সময় ব্যবহার করে।

function pstail () { python -c 'import os
last=set(os.listdir("/proc")) ; o=x=""
while True:
 pids=set(os.listdir("/proc"))
 new=pids.difference(last);last=pids
 for n in new:
  try: o,x=x,[j for j in open("/proc/"+n+"/cmdline")
    .read().split(chr(0)) if j]
  except IOError: pass
  if x and not o==x: print n,x' ; }

pstail

execsnoopকোন যুক্তি কোনটি তা আপনাকে আরও স্পষ্ট করে বলতে প্যাচও করতে পারেন :grep -v sub.*arg < execsnoop > n && chmod +x n && mv n execsnoop


1

CONFIG_FTRACEএবং CONFIG_KPROBESমাধ্যমেbrendangregg/perf-tools

git clone https://github.com/brendangregg/perf-tools.git
cd perf-tools
git checkout 98d42a2a1493d2d1c651a5c396e015d4f082eb20
sudo ./execsnoop

অন্য শেলের উপর:

while true; do sleep 1; date; done

প্রথম শেল বিন্যাসের ডেটা দেখায়:

Tracing exec()s. Ctrl-C to end.                                                        
Instrumenting sys_execve                                                               
   PID   PPID ARGS 
 20109   4336 date                                                                                       
 20110   4336 sleep 1                                                                                    
 20111   4336 date                                                                                                                                                                                                 
 20112   4336 sleep 1                                                                                    
 20113   4336 date                                                                                       
 20114   4336 sleep 1                                                                                    
 20115   4336 date                                                                                       
 20116   4336 sleep 1

CONFIG_PROC_EVENTS

নমুনা অধিবেশন:

$ su
# ./proc_events &
# /proc_events.out &
set mcast listen ok
# sleep 2 & sleep 1 &
fork: parent tid=48 pid=48 -> child tid=56 pid=56
fork: parent tid=48 pid=48 -> child tid=57 pid=57
exec: tid=57 pid=57
exec: tid=56 pid=56
exit: tid=57 pid=57 exit_code=0
exit: tid=56 pid=56 exit_code=0

CONFIG_PROC_EVENTSনেটলিংক সকেটের মাধ্যমে ইভেন্টগুলি ইউজারল্যান্ডে প্রকাশ করে ।

proc_events.c থেকে অভিযোজিত: https ://bewareofgeek.livej Journal.com/2945.html

#define _XOPEN_SOURCE 700
#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/connector.h>
#include <linux/cn_proc.h>
#include <signal.h>
#include <errno.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

static volatile bool need_exit = false;

static int nl_connect()
{
    int rc;
    int nl_sock;
    struct sockaddr_nl sa_nl;

    nl_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);
    if (nl_sock == -1) {
        perror("socket");
        return -1;
    }
    sa_nl.nl_family = AF_NETLINK;
    sa_nl.nl_groups = CN_IDX_PROC;
    sa_nl.nl_pid = getpid();
    rc = bind(nl_sock, (struct sockaddr *)&sa_nl, sizeof(sa_nl));
    if (rc == -1) {
        perror("bind");
        close(nl_sock);
        return -1;
    }
    return nl_sock;
}

static int set_proc_ev_listen(int nl_sock, bool enable)
{
    int rc;
    struct __attribute__ ((aligned(NLMSG_ALIGNTO))) {
        struct nlmsghdr nl_hdr;
        struct __attribute__ ((__packed__)) {
            struct cn_msg cn_msg;
            enum proc_cn_mcast_op cn_mcast;
        };
    } nlcn_msg;

    memset(&nlcn_msg, 0, sizeof(nlcn_msg));
    nlcn_msg.nl_hdr.nlmsg_len = sizeof(nlcn_msg);
    nlcn_msg.nl_hdr.nlmsg_pid = getpid();
    nlcn_msg.nl_hdr.nlmsg_type = NLMSG_DONE;

    nlcn_msg.cn_msg.id.idx = CN_IDX_PROC;
    nlcn_msg.cn_msg.id.val = CN_VAL_PROC;
    nlcn_msg.cn_msg.len = sizeof(enum proc_cn_mcast_op);

    nlcn_msg.cn_mcast = enable ? PROC_CN_MCAST_LISTEN : PROC_CN_MCAST_IGNORE;

    rc = send(nl_sock, &nlcn_msg, sizeof(nlcn_msg), 0);
    if (rc == -1) {
        perror("netlink send");
        return -1;
    }

    return 0;
}

static int handle_proc_ev(int nl_sock)
{
    int rc;
    struct __attribute__ ((aligned(NLMSG_ALIGNTO))) {
        struct nlmsghdr nl_hdr;
        struct __attribute__ ((__packed__)) {
            struct cn_msg cn_msg;
            struct proc_event proc_ev;
        };
    } nlcn_msg;
    while (!need_exit) {
        rc = recv(nl_sock, &nlcn_msg, sizeof(nlcn_msg), 0);
        if (rc == 0) {
            /* shutdown? */
            return 0;
        } else if (rc == -1) {
            if (errno == EINTR) continue;
            perror("netlink recv");
            return -1;
        }
        switch (nlcn_msg.proc_ev.what) {
            case PROC_EVENT_NONE:
                printf("set mcast listen ok\n");
                break;
            case PROC_EVENT_FORK:
                printf("fork: parent tid=%d pid=%d -> child tid=%d pid=%d\n",
                        nlcn_msg.proc_ev.event_data.fork.parent_pid,
                        nlcn_msg.proc_ev.event_data.fork.parent_tgid,
                        nlcn_msg.proc_ev.event_data.fork.child_pid,
                        nlcn_msg.proc_ev.event_data.fork.child_tgid);
                break;
            case PROC_EVENT_EXEC:
                printf("exec: tid=%d pid=%d\n",
                        nlcn_msg.proc_ev.event_data.exec.process_pid,
                        nlcn_msg.proc_ev.event_data.exec.process_tgid);
                break;
            case PROC_EVENT_UID:
                printf("uid change: tid=%d pid=%d from %d to %d\n",
                        nlcn_msg.proc_ev.event_data.id.process_pid,
                        nlcn_msg.proc_ev.event_data.id.process_tgid,
                        nlcn_msg.proc_ev.event_data.id.r.ruid,
                        nlcn_msg.proc_ev.event_data.id.e.euid);
                break;
            case PROC_EVENT_GID:
                printf("gid change: tid=%d pid=%d from %d to %d\n",
                        nlcn_msg.proc_ev.event_data.id.process_pid,
                        nlcn_msg.proc_ev.event_data.id.process_tgid,
                        nlcn_msg.proc_ev.event_data.id.r.rgid,
                        nlcn_msg.proc_ev.event_data.id.e.egid);
                break;
            case PROC_EVENT_EXIT:
                printf("exit: tid=%d pid=%d exit_code=%d\n",
                        nlcn_msg.proc_ev.event_data.exit.process_pid,
                        nlcn_msg.proc_ev.event_data.exit.process_tgid,
                        nlcn_msg.proc_ev.event_data.exit.exit_code);
                break;
            default:
                printf("unhandled proc event\n");
                break;
        }
    }

    return 0;
}

static void on_sigint(__attribute__ ((unused)) int unused)
{
    need_exit = true;
}

int main()
{
    int nl_sock;
    int rc = EXIT_SUCCESS;

    signal(SIGINT, &on_sigint);
    siginterrupt(SIGINT, true);
    nl_sock = nl_connect();
    if (nl_sock == -1)
        exit(EXIT_FAILURE);
    rc = set_proc_ev_listen(nl_sock, true);
    if (rc == -1) {
        rc = EXIT_FAILURE;
        goto out;
    }
    rc = handle_proc_ev(nl_sock);
    if (rc == -1) {
        rc = EXIT_FAILURE;
        goto out;
    }
    set_proc_ev_listen(nl_sock, false);
out:
    close(nl_sock);
    exit(rc);
}

গিটহাব আপসট্রিম

তবে আমি মনে করি না যে আপনি ইউআইডি এবং প্রক্রিয়া যুক্তিগুলির মতো প্রক্রিয়া ডেটা পেতে পারেন কারণ exec_proc_eventখুব অল্প ডেটা রয়েছে: https://github.com/torvalds/linux/blob/v4.16/incolve/uapi/linux/cn_proc .h # L80 আমরা এটি থেকে তাত্ক্ষণিকভাবে পড়ার চেষ্টা করতে পারি /proc, তবে এই প্রক্রিয়াটি শেষ হওয়ার ঝুঁকি রয়েছে এবং অন্য একটির পিআইডি গ্রহণ করেছে, সুতরাং এটি নির্ভরযোগ্য হবে না।

উবুন্টু 17.10 এ পরীক্ষা করা হয়েছে।


0

এছাড়াও আপনি প্রক্রিয়া দ্বারা সংস্থান ব্যবহার দেখার জন্য উপরে ব্যবহার করতে পারেন । এটি প্রতিটি অংশে সংস্থান ব্যবহারের লগিং এবং বিশ্লেষণের জন্য দরকারী সরঞ্জাম


-3

আপনি চেষ্টা করতে পারেন cat ~/.bash_history সেখানে আছে system log viewer, এটি আপনাকে সাহায্য করতে পারে।


1
~/.bash_historyকেবলমাত্র একটি কমান্ড রয়েছে যা আমি টার্মিনালে প্রদর্শিত করেছি apparent আমি কার্যকর সমস্ত প্রোগ্রামের লগ খুঁজছি, উদাহরণস্বরূপ যখন আমি আমার ই-মেইল ক্লায়েন্ট, জেডিট বা আমি আমার ব্রাউজারটি খুলতে আইকনটি ক্লিক করি এবং আমার ব্রাউজার নিজেই অন্য প্রক্রিয়া চালায়। new123456 এর উত্তরটি কৌতুক করেছিল।
রানেকস

1
আসুন যোগ করুন যে কমান্ডটি historyএই তথ্য অ্যাক্সেস করার স্বাভাবিক উপায়।
Bryn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.