En los sistemas Linux, toda esta información está disponible a través de la interfaz proc, y como tal es bastante fácil de escribir. Como ejemplo de trabajo (proveniente de un sistema RHEL6) veamos el proceso 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
Bien, entonces el pid es 1105, bastante fácil. Dado que el sistema proc almacena procesos en el formato de /proc/<pid>
, veamos qué datos se presentan.
[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
Estoy ejecutando esto como un usuario normal, por lo que parte de la información no está disponible. No es gran cosa, porque lo que realmente queremos es que haya un archivo llamado cmdline
.
[user@node1 ~]$ cat /proc/1105/cmdline
/sbin/rsyslogd-i/var/run/syslogd.pid-c4[user@node1 ~]$
Los argumentos parecen estar todos juntos. De hecho, están separados por caracteres nulos. Obtendrá una visualización más amigable al convertir los caracteres nulos en nuevas líneas (pero tenga en cuenta que esto eliminará la distinción entre separaciones entre argumentos y nuevas líneas reales en un argumento):
[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 ~]$
Por supuesto, esto no realmente nos da nada más allá de lo que obtuvimos de la salida ps. Sin embargo, dependiendo de lo que desee, puede ser más fácil de scripts. Si quisiéramos trabajar exclusivamente en bash, por ejemplo, podría usar esta estructura para iterar sobre todos los procesos:
[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 ~]$
Luego, usa eso como una lista de archivos para procesar.
Si estás en Perl, existe un módulo llamado Proc :: ProcessTable que consulta el Proc sistema y expone la misma información que un objeto.
Todo lo que se dice, si desea buscar contraseñas en la línea de comandos, a veces puede sentirse decepcionado. Algunas aplicaciones de alguna manera funcionan para enmascararlo, por ejemplo, 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