منبع اصلی نوشتار زیر در این لینک قرار دارد

grep در محتوای متغیر‌های محیطی کل سیستم با یک اسکریپت ساده

بگذارید کمی مقدمه چینی کنم تا به اصل قضیه برسم و اسکریپت مربوطه رو که حتی یک grep هم نداره توضیح بدم. تمام پراسس‌ها در دایرکتوری /proc دارای یک دایرکتوری هستند با نام PID خودشون،‌ که خیلی از منابع اون پراسس در اون داریکتوری ذخیره می‌شن. اگر برای اون پراسس حداقل یک متغیر محیطی ایجاد شده باشه، در همون دایرکتوری فایلی با نام environ ایجاد می‌شه. به مثال زیر توجه کنید، این مثال در مورد PID فرمان bash هست که کلی متغیر داره:

root@debian:/home/mohsen# cat /proc/4069/environ

XDG_SESSION_ID=1GDM_LANG=en_US.UTF-8XDG_RUNTIME_DIR=/run/user/1000WINDOWID=12582915HOME=/home/mohsenCOLORTERM=gnome-terminalXDG_SESSION_DESKTOP=awesomeXDG_SEAT=seat0GDMSESSION=awesomeTERMINATOR_UUID=urn:uuid:95733c91-bae1-411a-836c-319c396ae06eDISPLAY=:0SSH_AGENT_PID=1698DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-ByJdbw3fby,guid=72312f1af7594f58d0d5a97954f28444_JAVA_AWT_WM_NONREPARENTING=1LOGNAME=mohsenLANG=en_US.UTF-8WINDOWPATH=7SSH_AUTH_SOCK=/tmp/ssh-npu3VnARRiwC/agent.1655TERM=xtermXDG_VTNR=7USERNAME=mohsenXAUTHORITY=/var/run/gdm3/auth-for-mohsen-CmoIle/databaseDESKTOP_SESSION=awesomeORBIT_SOCKETDIR=/tmp/orbit-mohsenPWD=/home/mohsenUSER=mohsenPATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/gamesSHELL=/bin/bashroot@debian:/home/mohsen#

این هم از اسکریپت زیر:

#!/bin/bash
# --value PATTERN -o PS_COMMAND_OPTIONS

##########investagiting argumens ######################
function help(){
echo "Usage: -h: help
	     --help: help
	     --velue PATTERN : specify a patern for looking for (mandatory)
	     -o PS_COMMAND_OPTIONS: specifying a set of options for process management (mandatory)"
}
#############arg_process##########################################
if [ "$1" = "--value" -a "$3" != "-o"  -o "$1" != "--value" -a "$3" = "-o" -o ! $# -eq 4 ]; then 
	help;
	exit;
fi;
#################################
for i in `ls -d /proc/*[0-9]*`; do 
	number_of_used=`cat $i/environ 2> /dev/null | xargs -0 |awk  -v e_v2=$2 'BEGIN{}{for (i = 0; i < NF; i++) print $i}' |awk -F= '{print $2}' |awk -v e_patt=$2 '{for (i = 0 ; i<NF; i++){if (match($1,e_patt)) num++;} }END{print num;}'`
	
	if [ !  -z $number_of_used ]; then 
		echo -------------------Number of variables: $number_of_used-------------------------------------------------------------------------------------------------------------------------
		pid=`echo $i |awk -F/ '{print $3}'`
		header=`echo $4 |sed 's/,/ /g' `
		echo $header
		ps_content=`ps --no-headers -p $pid -o $4 2> /dev/null`
		if [ $? -ne 0 ]; then 
			help
			exit
		fi;
		echo $ps_content 
	fi;
done;

برای استفاده از آن می‌توان از عبارت زیر استفاده کرد:

oot@debian:/home/mohsen/codes/grepenv# ./grepenv.sh –value pid -o cmd,user

 ——————-Number of variables: 1————————————-

cmd user

/usr/sbin/apache2 -k start root

——————-Number of variables: 1————————————-

cmd user

/usr/sbin/apache2 -k start www-data

——————-Number of variables: 1————————————-

cmd user

/usr/sbin/apache2 -k start www-data

——————-Number of variables: 1————————————-

cmd user

/usr/sbin/apache2 -k start www-data

——————-Number of variables: 1————————————-

cmd user

/usr/sbin/apache2 -k start www-data

——————-Number of variables: 1————————————-

 

cmd user

/usr/sbin/privoxy –pidfile privoxy/

ارامتر اول یک عبارت برای جستجو می‌گیرد و پارامتر دوم همان option ها در فرمان ps هستند که برای شما نمایش داده شوند.در‌واقع این فرمان در کل سیستم می‌گردد و این عبارت را در کل متغیر‌های محیطی جسجتو می‌کند و اما چه برگرداند:

۱. پراسس هایی که آن را استفاده کرده‌اند.

۲. تعداد استفاده آن پراسس‌ها از این عبارت.

نکته‌: کد ساده است و شما خود می‌توانید آن را به دلخواه و نیاز خود تغییر دهید.

تمرین: برای چگونگی استفاده این اسکریپت برای پارامتر value– نام کاربری خود را پاس نمایید.

نوشته grep در محتوای متغیر‌های محیطی کل سیستم با یک اسکریپت ساده اولین بار در چرت و پرت پدیدار شد.



برچسب ها : , , , ,