Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

strace pour voir les fichiers lus par une commande

12 réponses
Avatar
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_pid=1134, 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_pid=1135, 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_pid=1136, 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_pid=1138, si_status=0, si_utime=0, si_stime=0} ---
[pid 1137] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=1137, 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_pid=1139, 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

10 réponses

1 2
Avatar
Olivier Darrouzet
Bonjour,
Vous pouvez essayer avec l'option -f de strace ? Cela permet de traces
aussi les fils.
--
Olivier.
Avatar
Francois Lafont
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
Avatar
Nicolas George
Francois Lafont , dans le message
<57550b64$0$705$, a écrit :
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.
Avatar
Francois Lafont
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
Avatar
Francois Lafont
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.
Avatar
Benoit Izac
Bonjour,
Le 06/06/2016 à 07:34, Francois Lafont a écrit dans le message
<57550b64$0$705$ :
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
Avatar
Benoit Izac
Bonjour,
Le 06/06/2016 à 07:34, Francois Lafont a écrit dans le message
<57550b64$0$705$ :
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
Avatar
Benoit Izac
Dans le message , le 06/06/2016 à 19:11, j'ai
é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
Avatar
Nicolas George
Francois Lafont , dans le message
<57559a51$0$3315$, a écrit :
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.
Avatar
Francois Lafont
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
1 2