Sui sistemi Linux, tutte queste informazioni sono disponibili tramite l'interfaccia proc e, in quanto tale, sono abbastanza facilmente programmabili. Come esempio di lavoro (proveniente da un sistema RHEL6) diamo un'occhiata al processo rsyslog.
[user@node1 ~]$ ps aux | grep rsyslog
root 1105 0.0 0.0 248680 1460 ? Sl May29 0:42 /sbin/rsyslogd -i /var/run/syslogd.pid -c 4
user 26440 0.0 0.0 103236 824 pts/4 S+ 11:38 0:00 grep rsyslog
Bene, quindi il pid è 1105, abbastanza facile. Poiché il sistema proc memorizza i processi nel formato di /proc/<pid>
, vediamo quali dati vengono presentati.
[user@node1 ~]$ ls -l /proc/1105
ls: cannot read symbolic link /proc/1105/cwd: Permission denied
ls: cannot read symbolic link /proc/1105/root: Permission denied
ls: cannot read symbolic link /proc/1105/exe: Permission denied
total 0
dr-xr-xr-x. 2 root root 0 Jun 15 11:39 attr
-rw-r--r--. 1 root root 0 Jun 15 11:39 autogroup
-r--------. 1 root root 0 Jun 15 11:39 auxv
-r--r--r--. 1 root root 0 Jun 15 11:39 cgroup
--w-------. 1 root root 0 Jun 15 11:39 clear_refs
-r--r--r--. 1 root root 0 Jun 15 11:35 cmdline
-rw-r--r--. 1 root root 0 Jun 15 11:39 coredump_filter
-r--r--r--. 1 root root 0 Jun 15 11:39 cpuset
lrwxrwxrwx. 1 root root 0 Jun 15 11:39 cwd
-r--------. 1 root root 0 Jun 15 11:39 environ
lrwxrwxrwx. 1 root root 0 Jun 15 11:39 exe
dr-x------. 2 root root 0 Jun 15 11:39 fd
dr-x------. 2 root root 0 Jun 15 11:39 fdinfo
-r--------. 1 root root 0 Jun 15 11:39 io
-rw-------. 1 root root 0 Jun 15 11:39 limits
-rw-r--r--. 1 root root 0 Jun 15 11:39 loginuid
-r--r--r--. 1 root root 0 Jun 15 11:39 maps
-rw-------. 1 root root 0 Jun 15 11:39 mem
-r--r--r--. 1 root root 0 Jun 15 11:39 mountinfo
-r--r--r--. 1 root root 0 Jun 15 11:39 mounts
-r--------. 1 root root 0 Jun 15 11:39 mountstats
dr-xr-xr-x. 6 root root 0 Jun 15 11:39 net
-r--r--r--. 1 root root 0 Jun 15 11:39 numa_maps
-rw-r--r--. 1 root root 0 Jun 15 11:39 oom_adj
-r--r--r--. 1 root root 0 Jun 15 11:39 oom_score
-rw-r--r--. 1 root root 0 Jun 15 11:39 oom_score_adj
-r--r--r--. 1 root root 0 Jun 15 11:39 pagemap
-r--r--r--. 1 root root 0 Jun 15 11:39 personality
lrwxrwxrwx. 1 root root 0 Jun 15 11:39 root
-rw-r--r--. 1 root root 0 Jun 15 11:39 sched
-r--r--r--. 1 root root 0 Jun 15 11:39 schedstat
-r--r--r--. 1 root root 0 Jun 15 11:39 sessionid
-r--r--r--. 1 root root 0 Jun 15 11:39 smaps
-r--r--r--. 1 root root 0 Jun 15 11:39 stack
-r--r--r--. 1 root root 0 Jun 15 11:35 stat
-r--r--r--. 1 root root 0 Jun 15 11:39 statm
-r--r--r--. 1 root root 0 Jun 15 11:35 status
-r--r--r--. 1 root root 0 Jun 15 11:39 syscall
dr-xr-xr-x. 6 root root 0 Jun 15 11:39 task
-r--r--r--. 1 root root 0 Jun 15 11:39 wchan
Lo sto facendo come un utente normale, quindi alcune informazioni non sono disponibili. Un grosso problema, perché quello che vogliamo veramente è che ci sia un file chiamato cmdline
.
[user@node1 ~]$ cat /proc/1105/cmdline
/sbin/rsyslogd-i/var/run/syslogd.pid-c4[user@node1 ~]$
Gli argomenti sembrano fatti funzionare insieme. Infatti, sono separati da caratteri nulli. Si otterrà una visualizzazione più amichevole trasformando i caratteri nulli in nuove righe (ma si noti che si eliminerà la distinzione tra separazioni tra argomenti e righe nuove effettive in un argomento):
[user@node1 ~]$ tr 'for p in /proc/[0-9]*/cmdline; do
…
done
' '\n' </proc/1105/cmdline; echo
/sbin/rsyslogd
-i
/var/run/syslogd.pid
-c
4
[user@node1 ~]$
Certo, questo veramente non ci dà nulla oltre a ciò che abbiamo ottenuto dall'output di ps. Tuttavia, a seconda di ciò che vuoi, potrebbe essere più facilmente programmabile. Ad esempio, se volessimo lavorare esclusivamente in bash, potremmo usare questa struttura per iterare su tutti i processi:
[user@node2 ~]$ ps aux | grep mysql
user 7974 0.0 0.1 157116 2732 pts/0 S+ 11:47 0:00 mysql -u root -px xxxxxxxxxx database
[user@node2 ~]$ cat /proc/7974/cmdline
mysql-uroot-pxxxxxxxxxxxdashboard[user@node2 ~]$
Quindi usalo come elenco file per l'elaborazione.
Se invece sei in Perl, esiste un modulo chiamato Proc :: ProcessTable che interroga il sistema proc ed espone le stesse informazioni di un oggetto.
Tutto ciò che viene detto, se si desidera cercare password sulla riga di comando, a volte può essere deluso. Alcune applicazioni in qualche modo funzionano per mascherarlo, ad esempio MySQL:
[user@node1 ~]$ ps aux | grep rsyslog
root 1105 0.0 0.0 248680 1460 ? Sl May29 0:42 /sbin/rsyslogd -i /var/run/syslogd.pid -c 4
user 26440 0.0 0.0 103236 824 pts/4 S+ 11:38 0:00 grep rsyslog