Isso é meio que um truque, mas pelo menos funciona. Requer que você tenha root
nesse servidor:
Olhando para a saída de ps aux
, vejo o fork de um usuário de sshd
, como por exemplo, neste caso, o usuário mst
:
$ ps aux | grep ssh
mst 19325 0.0 0.0 76268 1920 ? S 21:20 0:00 sshd: mst@pts/6
Por isso, verifico os descritores de arquivo deste processo da seguinte forma:
$ sudo ls -lha /proc/19325/fd
total 0
dr-x------ 2 root root 0 Aug 30 21:26 .
dr-xr-xr-x 7 mst users 0 Aug 30 21:25 ..
lrwx------ 1 root root 64 Aug 30 21:26 0 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 1 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 11 -> /dev/ptmx
lrwx------ 1 root root 64 Aug 30 21:26 12 -> /dev/ptmx
lrwx------ 1 root root 64 Aug 30 21:26 2 -> /dev/null
lrwx------ 1 root root 64 Aug 30 21:26 3 -> socket:[138972]
lrwx------ 1 root root 64 Aug 30 21:26 4 -> socket:[138198]
lrwx------ 1 root root 64 Aug 30 21:26 5 -> socket:[138200]
lrwx------ 1 root root 64 Aug 30 21:26 6 -> socket:[138207]
lr-x------ 1 root root 64 Aug 30 21:26 7 -> pipe:[138212]
l-wx------ 1 root root 64 Aug 30 21:26 8 -> pipe:[138212]
lrwx------ 1 root root 64 Aug 30 21:26 9 -> /dev/ptmx
Três desses links apontam para /dev/ptmx
, estes são stdin
, stdout
e stderr
. Como o shell do usuário está imprimindo todos os comandos que ele insere, e também a saída desses comandos, vejo seu stdout
usando strace
e filtrando por read
chamadas do sistema no número fd 11
(porque 11
é o segundo link para /dev/ptmx
).
sudo strace -e read -s 256 -p 19325 2>&1 | grep 'read(11'
E eu posso ver que o usuário digita um comando ls
:
read(11, "l", 16384) = 1
read(11, "s", 16384) = 1
Ok, a saída não é bonita ... mas funciona