strace pour voir les fichiers lus par une commande

Le
Francois Lafont
Bonjour à tous,

Je suis sous une Ubuntu Trusty (14.04). Sous cette distribution,
je suis certain qu'en faisant :

service ssh restart

le fichier /etc/init/ssh.conf est lu à un moment donné (ce fichier
s'appelle le fichier de job upstart je crois, c'est l'équivalent
de /etc/init.d/ssh mais pour upstart).

Seulement je pensais aussi pouvoir m'assurer que le fichier
/etc/init/ssh.conf était bien lu par un des processus enfants
de la commande "service ssh restart" grâce à strace. Notamment,
avec :

LC_ALL=C strace -f -e trace=open service ssh restart

Or, je constate qu'à aucun moment strace ne m'indique que le fichier
/etc/init/ssh.conf est bien lu.

Est-ce que vous pourriez me dire pourquoi ? (sachant que je suis
absolument certain que le fichier /etc/init/ssh.conf est bien lu
suite au restart)

Pour info, voici ce que j'obtiens avec strace :

root@trusty:~# LC_ALL=C strace -f -e trace=open service ssh restart
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/sbin/service", O_RDONLY) = 3
Process 1134 attached
[pid 1134] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 1134] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 1134] +++ exited with 0 +++
SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid34, si_status=0, si_utime=0, si_stime=0}
Process 1135 attached
[pid 1135] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 1135] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 1135] +++ exited with 0 +++
SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid35, si_status=0, si_utime=0, si_stime=0}
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
Process 1136 attached
[pid 1136] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 1136] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 1136] open("/usr/bin/which", O_RDONLY) = 3
[pid 1136] +++ exited with 0 +++
SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid36, si_status=0, si_utime=0, si_stime=0}
Process 1138 attached
[pid 1138] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 1138] open("/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
[pid 1138] open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
[pid 1138] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
Process 1137 attached
[pid 1137] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 1137] open("/lib/x86_64-linux-gnu/libnih.so.1", O_RDONLY|O_CLOEXEC) = 3
[pid 1137] open("/lib/x86_64-linux-gnu/libnih-dbus.so.1", O_RDONLY|O_CLOEXEC) = 3
[pid 1137] open("/lib/x86_64-linux-gnu/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = 3
[pid 1137] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 1137] open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
[pid 1137] open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
[pid 1138] +++ exited with 0 +++
[pid 1133] SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid38, si_status=0, si_utime=0, si_stime=0}
[pid 1137] +++ exited with 0 +++
SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid37, si_status=0, si_utime=0, si_stime=0}
Process 1139 attached
[pid 1139] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 1139] open("/lib/x86_64-linux-gnu/libnih.so.1", O_RDONLY|O_CLOEXEC) = 3
[pid 1139] open("/lib/x86_64-linux-gnu/libnih-dbus.so.1", O_RDONLY|O_CLOEXEC) = 3
[pid 1139] open("/lib/x86_64-linux-gnu/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = 3
[pid 1139] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 1139] open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
[pid 1139] open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
ssh stop/waiting
[pid 1139] +++ exited with 0 +++
SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid39, si_status=0, si_utime=0, si_stime=0}
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnih.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnih-dbus.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/librt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
ssh start/running, process 1143
+++ exited with 0 +++

Merci d'avance pour votre aide.

--
François Lafont
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Darrouzet
Le #26400752
Bonjour,
Vous pouvez essayer avec l'option -f de strace ? Cela permet de traces
aussi les fils.
--
Olivier.
Francois Lafont
Le #26400779
Bonjour,
On 06/06/2016 09:40, Olivier Darrouzet wrote:
Vous pouvez essayer avec l'option -f de strace ? Cela permet de traces
aussi les fils.

Heu... et bien sauf erreur, l'option -f est bien présente dans mon message
précédent. D'où mon interrogation. ;)
--
François Lafont
Nicolas George
Le #26400798
Francois Lafont , dans le message
Pour info, voici ce que j'obtiens avec strace :
:~# LC_ALL=C strace -f -e trace=open service ssh restart
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/sbin/service", O_RDONLY) = 3
Process 1134 attached

Ce n'est qu'un extrait, complètement inutilisable.
Je conseillerais d'utiliser l'option -o, et aussi d'ajouter « -s 1024 » ou
plus.
Francois Lafont
Le #26400822
On 06/06/2016 14:40, Nicolas George wrote:
Je conseillerais d'utiliser l'option -o

On est d'accord que l'option -o permet simplement d'envoyer la sortie de
strace dans un fichier plutôt que sur stderr, ça ne changera pas le contenu
affiché par la commande, n'est-ce pas ?
et aussi d'ajouter « -s 1024 » ou plus.

Ah je ne connaissais pas, merci.
En fait je m'aperçois que si je laisse "-e trace=open", je ne vois pas le
fichier /etc/init/ssh.conf dans la sortie de strace. En revanche, si j'enlève
"-e trace=open" alors le fichier apparaît dans la sortie. Comment ça se fait ?
Pour info, voici la sortie de LC_ALL=C strace -f -o f1.txt -s 1024 service ssh restart:
https://gist.github.com/flaf/12c460f58bbc11a7d9f0f1c5032f6175
Francois Lafont
Le #26400825
On 06/06/2016 14:40, Nicolas George wrote:
:~# LC_ALL=C strace -f -e trace=open service ssh restart
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/sbin/service", O_RDONLY) = 3
Process 1134 attached

Ce n'est qu'un extrait, complètement inutilisable.

Au fait, je ne sais pas ce que tu entends pas "extrait" mais dans mon
message initial j'ai bien effectué un copier-coller complet de la commande
indiquée.
Benoit Izac
Le #26400835
Bonjour,
Le 06/06/2016 à 07:34, Francois Lafont a écrit dans le message
LC_ALL=C strace -f -e trace=open service ssh restart

Tu peux économiser un peut en omettant le « trace= » qui est par défaut.
open("/lib/x86_64-linux-gnu/libnih-dbus.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = 3

Je ne sais pas comment fonctionne /usr/sbin/service mais si il charge
ces bibliothèques, il y a des chances qu'il communique à un autre
processus de faire le boulot pour lui ce qui expliquerait que tu ne vois
rien via les (v)fork/clone. Si c'est le cas, il faudrait tracer l'autre
processus.
--
Benoit Izac
Benoit Izac
Le #26400834
Bonjour,
Le 06/06/2016 à 07:34, Francois Lafont a écrit dans le message
LC_ALL=C strace -f -e trace=open service ssh restart

Tu peux économiser un peu en omettant le « trace= » qui est par défaut.
open("/lib/x86_64-linux-gnu/libnih-dbus.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = 3

Je ne sais pas comment fonctionne /usr/sbin/service mais si il charge
ces bibliothèques, il y a des chances qu'il communique à un autre
processus de faire le boulot pour lui ce qui expliquerait que tu ne vois
rien via les (v)fork/clone. Si c'est le cas, il faudrait tracer l'autre
processus.
--
Benoit Izac
Benoit Izac
Le #26400842
Dans le message écrit :
LC_ALL=C strace -f -e trace=open service ssh restart

Tu peux économiser un peu en omettant le « trace= » qui est par défaut.
open("/lib/x86_64-linux-gnu/libnih-dbus.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = 3

Je ne sais pas comment fonctionne /usr/sbin/service mais si il charge
ces bibliothèques, il y a des chances qu'il communique à un autre
processus de faire le boulot pour lui ce qui expliquerait que tu ne vois
rien via les (v)fork/clone. Si c'est le cas, il faudrait tracer l'autre
processus.

Avec systemd, c'est systemd (pid=1) qui s'occupe de cela :
1. dans un terminal « systemctl restart sshd »
2. dans un autre terminal :
# strace -f -e open -p1 2>&1 | grep ssh
[...]
[pid 3280] open("/etc/ssh/sshd_config", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_rsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_rsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_rsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_rsa_key.pub", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_dsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_dsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_dsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_dsa_key.pub", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_ecdsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_ecdsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_ecdsa_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_ecdsa_key.pub", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_ed25519_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_ed25519_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_ed25519_key", O_RDONLY) = 3
[pid 3280] open("/etc/ssh/ssh_host_ed25519_key.pub", O_RDONLY) = 3
[pid 3280] open("/run/sshd.pid", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 5
--
Benoit Izac
Nicolas George
Le #26400841
Francois Lafont , dans le message
En fait je m'aperçois que si je laisse "-e trace=open"

Pardon, j'avais raté ça dans les options de départ, c'est pour ça que je
pensais que c'était tronqué : c'était tronqué à la source.
Pour info, voici la sortie de LC_ALL=C strace -f -o f1.txt -s 1024 service ssh restart:
https://gist.github.com/flaf/12c460f58bbc11a7d9f0f1c5032f6175

Et voici la partie importante :
1364 socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3
1364 connect(3, {sa_family¯_LOCAL, sun_path=@"/com/ubuntu/upstart"}, 22) = 0
Contrairement à l'antique boot SysV à base de scripts dans /etc/init.d/, ce
n'est pas ton shell qui invoque directement les daemons du service, c'est
upstart, après réception de commandes sur une socket. C'est un net progrès,
ça évite en particulier que des bouts de l'environnement de l'utilisateur ne
se glissent dans celui du processus.
Francois Lafont
Le #26400992
On 06/06/2016 19:27, Nicolas George wrote:
Et voici la partie importante :
1364 socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC, 0) = 3
1364 connect(3, {sa_family¯_LOCAL, sun_path=@"/com/ubuntu/upstart"}, 22) = 0
Contrairement à l'antique boot SysV à base de scripts dans /etc/init.d/, ce
n'est pas ton shell qui invoque directement les daemons du service, c'est
upstart, après réception de commandes sur une socket. C'est un net progrès,
ça évite en particulier que des bouts de l'environnement de l'utilisateur ne
se glissent dans celui du processus.

Ah ok, voilà donc pourquoi cela m'échappait avec l'option -e trace=open.
Tout s'explique. C'est effectivement un progrès même si, du coup, ça complique
la tâche quand on veut stracer une commande. ;)
Merci beaucoup pour l'aide.
À+
--
François Lafont
Publicité
Poster une réponse
Anonyme