philpep's blog - tag soft philpep's blog - tag soft rss http://blog.philpep.org fr Mon, 04 Jan 2010 23:10:53 GMT Pblog Ssmtp pour remplacer sendmail http://blog.philpep.org/post/Ssmtp-pour-remplacer-sendmail http://blog.philpep.org/post/Ssmtp-pour-remplacer-sendmail Mon, 04 Jan 2010 23:10:53 GMT <p>Sur mon serveur FreeBSD j'ai 4 <a href="http://en.wikipedia.org/wiki/FreeBSD_jail">jails</a> et par défaut le système envoie régulièrement des <code>security run output</code> à <code>root@localhost</code> pour l'informer de ce qu'il se passe sur le système (nouveau fichiers etc). Tout ça c'est très bien sauf que un hote et 4 jails ça fait 5 compte mail à visiter, c'est pas trop convi et en plus on a pas envie de faire tourner sendmail juste pour ça.</p> <p>J'ai donc décidé d'utiliser un MTA très simple appelé (devinez comment) : <code>Simple smtp agent</code>. Chaque mail envoyé depuis la machine (en appelant sendmail) partira vers un serveur smtp de mon choix, ainsi je récupère tous les mails sur mon compte mail usuel.</p> <div class="codehilite"><pre># cd /usr/ports/mail/ssmtp # make install Information for ssmtp-2.62.3: Install notice: sSMTP has been installed successfully. To replace sendmail with ssmtp type &quot;make replace&quot; # make replace </pre></div> <p>Ensuite j'ai crée mon <code>/usr/local/etc/ssmtp/ssmtp.conf</code> : </p> <div class="codehilite"><pre><span class="c1"># Serveur de mail à contacter pour l&#39;envoi + le port</span> <span class="c1"># par defaut c&#39;est le port 25</span> <span class="n">mailhub</span><span class="o">=</span><span class="n">mail</span><span class="o">.</span><span class="n">philpep</span><span class="o">.</span><span class="n">org:578</span> <span class="c1"># Domaine d&#39;où semble venir le mail</span> <span class="n">rewriteDomain</span><span class="o">=</span><span class="n">philpep</span><span class="o">.</span><span class="n">org</span> <span class="c1"># Domaine à donner pendant le HELO</span> <span class="c1"># À accorder avec le reverse DNS de votre machine</span> <span class="c1"># vu depuis le serveur de mail.</span> <span class="n">hostname</span><span class="o">=</span><span class="n">shen</span><span class="o">.</span><span class="n">philpep</span><span class="o">.</span><span class="n">org</span> </pre></div> <p>Arrangez vous pour que le serveur de mail accepte de vous relayer, moi c'est le cas parce que je suis en local et mon postfix relaie ce qui vient du réseau local. Mais si ce n'est pas le cas (genre vous utilisez le serveur mail de votre fournisseur de mail), on peut configurer l'authentification SMTP, SSL/TLS et tout le reste.</p> <p>Ensuite désactivez sendmail dans <code>/etc/rc.conf</code> puisqu'il ne sert plus :</p> <div class="codehilite"><pre><span class="n">sendmail_submit_enable</span><span class="o">=</span><span class="s">&quot;NO&quot;</span> <span class="n">sendmail_outbound_enable</span><span class="o">=</span><span class="s">&quot;NO&quot;</span> <span class="n">sendmail_msp_queue_enable</span><span class="o">=</span><span class="s">&quot;NO&quot;</span> </pre></div> <p>Pour tester l'envoi :</p> <div class="codehilite"><pre><span class="nv">$</span> <span class="nv">dmesg</span> <span class="o">|</span> <span class="n">mail</span> <span class="o">-</span><span class="n">s</span> <span class="s">&quot;works ?&quot;</span> <span class="n">lapin</span><span class="nv">@barreenfer</span><span class="o">.</span><span class="n">com</span> <span class="nv">$</span> <span class="nv">if</span> <span class="p">[[</span> <span class="vg">$?</span> <span class="o">-</span><span class="ow">ne</span> <span class="mi">0</span> <span class="p">]];</span> <span class="k">then</span> <span class="n">man</span> <span class="n">ssmtp</span><span class="p">;</span> <span class="n">fi</span> </pre></div> <p>EDIT 5/01/10 17:15 </p> <ul> <li>client smtp -&gt; MTA</li> </ul> fail2ban sshd et pf http://blog.philpep.org/post/fail2ban-sshd-et-pf http://blog.philpep.org/post/fail2ban-sshd-et-pf Wed, 18 Nov 2009 18:28:10 GMT <p>Mon <code>/var/log/auth.log</code> est blindé de choses du genre :</p> <div class="codehilite"><pre>Nov 18 17:56:27 lenine sshd[49297]: Invalid user marcio from 24.17.93.35 Nov 18 17:56:27 lenine sshd[49297]: error: PAM: authentication error for illegal user marcio from 24.17.93.35 Nov 18 17:56:27 lenine sshd[49297]: Failed keyboard-interactive/pam for invalid user marcio from 24.17.93.35 port 63330 ssh2 Nov 18 17:58:05 lenine sshd[49312]: Address 92.126.194.108 maps to alfa.navsystem.ru, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT! Nov 18 17:58:05 lenine sshd[49312]: Invalid user marcio from 92.126.194.108 Nov 18 17:58:05 lenine sshd[49312]: error: PAM: authentication error for illegal user marcio from 92.126.194.108 Nov 18 17:58:05 lenine sshd[49312]: Failed keyboard-interactive/pam for invalid user marcio from 92.126.194.108 port 38920 ssh2 </pre></div> <p>C'est une attaque classique par dictionnaire mais distribuée. Ma seule défense pour l'instant c'est mon parre feu qui <a href="http://blog.philpep.org/post/Regles-pf-pour-bloquer-le-ssh-bruteforcing-et-le-deni-de-service">bloquait les bruteforces un peu trop rapides</a>. Alors même si pf en filtre quand même pas mal, les petits malins tournent sur plusieurs IPs pour faire un bruteforce moins visible.</p> <p>J'ai donc décidé de bloquer le reste avec <a href="http://www.fail2ban.org">fail2ban</a>, la conf par défaut n'est pas adapté à ma config, j'ai des besoin précis sur le filtre sshd et il faut que ça marche avec <a href="http://blog.philpep.org/tag/Packet%20Filter">pf</a>.</p> <p>L'install est toujours aussi simple :</p> <div class="codehilite"><pre># make -C /usr/ports/security/py-fail2ban install </pre></div> <p>La conf est dans <code>/usr/local/etc/fail2ban</code></p> <p>En premier lieu, créer l'action pour pf : </p> <p><code>action.d/pf.conf</code></p> <div class="codehilite"><pre>[Definition] actionstart = actionstop = actioncheck = actionban = pfctl -t flood -T add &lt;ip&gt; actionunban = pfctl -t flood -T del &lt;ip&gt; </pre></div> <p>Comme vous voyez on va largement utiliser les tables pf, il y a donc quelques modifs à faire dans votre <code>/etc/pf.conf</code> :</p> <div class="codehilite"><pre><span class="c"># La table</span> table &lt;flood&gt; persist <span class="c"># On laisse passer tout sauf les IP de &lt;flood&gt;</span> pass in inet proto tcp from ! &lt;flood&gt; to <span class="nv">$ext_if</span> port ssh </pre></div> <p>Ensuite on modifie le filtre <code>filter.d/sshd.conf</code> :</p> <div class="codehilite"><pre>[INCLUDES] before = common.conf [Definition] _daemon = sshd failregex = ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from &lt;HOST&gt;\s*$ ^%(__prefix_line)sAddress &lt;HOST&gt; .* POSSIBLE BREAK-IN ATTEMPT\s*$ ignoreregex = </pre></div> <p>Et on active le filtre dans <code>jail.conf</code> :</p> <div class="codehilite"><pre>[ssh-pf] enabled = true filter = sshd action = pf sendmail-whois[name=SSH, dest=root@localhost, sender=noreply@localhost] logpath = /var/log/auth.log maxretry = 1 bantime = 86400 </pre></div> <p>Ils sont bannis pour 1 jours (de quoi leur faire perdre beaucoup de temps). En prime pour chaque ban vous recevez le <code>whois</code> de l'IP concernée par mail.</p> <p>Finalement on oublie pas de lancer fail2ban :</p> <div class="codehilite"><pre># echo fail2ban_enable=\&quot;YES\&quot; &gt;&gt; /etc/rc.conf # /usr/local/etc/rc.d/fail2ban start </pre></div> <p>Ce qui pourrait être intéressant c'est de choper automatiquement les adresses mail <code>Abuse</code> du whois pour envoyer un mail au FAI du méchant pour lui dire tout ce qu'on pense de son client. Mais bon, on ne va pas non plus faire de délation à la HADOPI.</p> Spamd http://blog.philpep.org/post/Spamd http://blog.philpep.org/post/Spamd Sat, 31 Oct 2009 13:50:31 GMT <p>Spamd ou comment bloquer les spams sans discriminer à priori des adresses IPs et sans remettre en cause la neutralité du réseau.</p> <p>J'ai écrit une <a href="http://wiki.bender-labs.org/bsd/spamd">page sur spamd</a> sur le principe de fonctionnement et sa mise en place sur OpenBSD.</p> <p>Ce tout nouveau wiki cogéré par <a href="http://www.philpep.org">philpep.org</a> et <a href="http://www.bender-labs.org">bender-labs.org</a> est plus adapté que mon blog pour ce genre de choses car vous pouvez aussi apporter votre contribution pour faire part de votre expérience (ne serait-ce que pour corriger d'éventuelles fautes d'orthographes et de grammaires :-) ).</p> NAS, un serveur audio http://blog.philpep.org/post/NAS,-un-serveur-audio http://blog.philpep.org/post/NAS,-un-serveur-audio Fri, 11 Sep 2009 16:56:42 GMT <p>Je viens de réaliser une petit prouesse qui vaut bien un billet.</p> <p>La situation : j'ai une super sono qui ne marche malheureusement qu'avec une entrée optique. Et la seule machine qui a une sortie optique chez moi c'est la machine qui sur laquelle vous êtes connectée en ce moment, mon serveur. Je n'ai pas d'écrans sur ce serveur et je n'ai pas envie d'installer X.org et tout ce qui vient avec. Par contre j'ai un portable avec une belle interface graphique, seulement j'ai un son tout pourri là dessus.</p> <p>L'idée est donc de faire jouer le son par le serveur et d'afficher l'image sur le portable. Ce que X.org permet par son architecture client/serveur le serveur X (mon portable) pourrait afficher l'image que lui envoie le client (mplayer sur mon serveur) et le son serait joué par le client (donc sur le serveur ici). Sauf qu'une image, et à plus forte raison une serie d'image comme un film, ça représente beaucoup de donnée à transmettre sur le réseau, et même sur le reseau local il y a des latences qui ne sont pas négligeables.</p> <p>Donc je me suis dit que faire l'inverse doit être plus rapide. C'est à dire mplayer sur mon portable qui envoie les données audio par le réseau au serveur. Et c'est possible avec NAS (Network Audio System). Voilà comment faire :</p> <p>Installer NAS sur le serveur (ici sur FreeBSD)</p> <div class="codehilite"><pre>make -C /usr/ports/audio/nas install clean </pre></div> <p>La configuration par defaut marche très bien. On peut ensuite lancer NAS en tand qu'utilisateur normal :</p> <div class="codehilite"><pre><span class="err">nasd</span> <span class="err">:0</span> <span class="err">-aa</span> <span class="err">-b</span> <span class="err">-config</span> <span class="err">/usr/local/etc/nasd.conf.eg</span> </pre></div> <p>L'option :X dis à nasd d'écouter sur le port 8000+X (je sais c'est vraiment pas convi mais bon c'est comme ça).</p> <p>Et voilà pour nous (8000 + 0) c'est sur le port 8000 filtrez le comme vous voulez avec votre parre-feu.</p> <p>Ensuite sur le client (mon portable) il suffit d'indiquer à mplayer l'host et le port du serveur nas comme expliqué dans la page de man. Puis lancez votre film/musique. L'host peut être une IP ou un nom de domaine peu importe.</p> <div class="codehilite"><pre><span class="n">export</span> <span class="n">AUDIOSERVER</span><span class="o">=</span><span class="n">tcp</span><span class="o">/</span><span class="n">host:8000</span> <span class="n">mplayer</span> <span class="o">-</span><span class="n">ao</span> <span class="n">nas</span> <span class="n">fichier</span><span class="o">.</span><span class="n">avi</span> </pre></div> Un petit lecteur audio bien pratique http://blog.philpep.org/post/Un-petit-lecteur-audio-bien-pratique http://blog.philpep.org/post/Un-petit-lecteur-audio-bien-pratique Sat, 05 Sep 2009 21:41:39 GMT <p>Marre des lecteurs audio qui mettent 4h a charger une interface graphique peu intuitive qui offre pleins de fonctionnalités toute les plus inutiles les une des autres. Revenez donc aux principes d'UNIX et installez ce petit logiciel qui ne fait que ce qu'on lui demande : <a href="http://moc.daper.net/">http://moc.daper.net/</a> (Music On Console). Installez le comme a votre habitude puis lancez le avec cette commande : mocp</p> <p>Le raccourcis pour avoir l'aide (donc les autres raccourcis claviers) est ?</p> <p>Je vous laisse découvrir ce soft bien pratique qui gère aussi les playlist. De plus une fois qu'il est lancé vous pouvez le quitter avec q , quittez votre session shell et la musique continue o/ (Le processus est détaché de la session shell courante). Pour vraiment quitter moc il faut faire Q.</p> Que font vos processus ? La commande strace http://blog.philpep.org/post/Que-font-vos-processus---La-commande-strace http://blog.philpep.org/post/Que-font-vos-processus---La-commande-strace Sat, 05 Sep 2009 20:27:35 GMT <p>J'ai découvert une commande ulta utile, que ce soit pour la sécurité ou pour débuger : la commande strace.</p> <p>Comme vous le savez, lorsque vous codez en C ou en tout autre langage le code est traduit en langage machine mais il peut aussi faire appel aux fameux "appels systèmes" gérés par l'OS (comme par exemple cloner des processus, accéder à un fichier, afficher quelque chose à l'écran...). Mais comment avoir la trace de toutes ces informations ? La commande strace fait tout cela.</p> <p>Sur *BSD, vous pouvez utiliser de manière analogue <a href="http://www.freebsd.org/cgi/man.cgi?query=truss">truss(1)</a>.</p> <p>Dans la pratique, strace permet de voir ce que fait un processus, on y accède en lui donnant le PID du processus (qu'on peut avoir avec la commande ps). Par exemple si je veux savoir ce que fait mon shell :</p> <div class="codehilite"><pre>% ps 3982 pts/3 00:00:00 zsh <span class="c"># Une fois qu&#39;on a le pid on lance strace (dans un autre shell)</span> % strace -p3982 </pre></div> <p>Regardons un peu ce qu'il se passe pour un simple <em>ls</em> :</p> <div class="codehilite"><pre><span class="c"># Lecture d&#39;un l au clavier</span> <span class="nb">read</span><span class="o">(</span>10, <span class="s2">&quot;l&quot;</span>..., 1<span class="o">)</span> <span class="o">=</span> 1 <span class="c"># écriture du l a l&#39;écran (celui qu&#39;il vient de lire</span> write<span class="o">(</span>10, <span class="s2">&quot;l&quot;</span>..., 1<span class="o">)</span> <span class="o">=</span> 1 <span class="c"># Lecture du s</span> <span class="nb">read</span><span class="o">(</span>10, <span class="s2">&quot;s&quot;</span>..., 1<span class="o">)</span> <span class="o">=</span> 1 <span class="c"># ecriture du s</span> write<span class="o">(</span>10, <span class="s2">&quot;\10ls&quot;</span>..., 3<span class="o">)</span> <span class="o">=</span> 3 <span class="c"># lecture de la touche enter (en C)</span> <span class="nb">read</span><span class="o">(</span>10, <span class="s2">&quot;</span> <span class="s2">&quot;</span>..., 1<span class="o">)</span> <span class="o">=</span> 1 write<span class="o">(</span>10, <span class="s2">&quot;</span> <span class="s2">&quot;</span>..., 2<span class="o">)</span> <span class="o">=</span> 2 alarm<span class="o">(</span>0<span class="o">)</span> <span class="o">=</span> 0 ioctl<span class="o">(</span>10, SNDCTL_TMR_STOP or TCSETSW, <span class="o">{</span>B38400 opost isig icanon <span class="nb">echo</span> ...<span class="o">})</span> <span class="o">=</span> 0 <span class="nb">time</span><span class="o">(</span>NULL<span class="o">)</span> <span class="o">=</span> 1229629587 pipe<span class="o">([</span>3, 4<span class="o">])</span> <span class="o">=</span> 0 gettimeofday<span class="o">({</span>1229629587, 864550<span class="o">}</span>, <span class="o">{</span>0, 0<span class="o">})</span> <span class="o">=</span> 0 <span class="c"># clone ----&gt; un nouveau processus est crée en fait fork() execute l&#39;appel système clone, le nouveau pid est 4024</span> clone<span class="o">(</span><span class="nv">child_stack</span><span class="o">=</span>0, <span class="nv">flags</span><span class="o">=</span>CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, <span class="nv">child_tidptr</span><span class="o">=</span>0xb7ddd998<span class="o">)</span> <span class="o">=</span> 4024 close<span class="o">(</span>4<span class="o">)</span> <span class="o">=</span> 0 <span class="nb">read</span><span class="o">(</span>3, <span class="s2">&quot;&quot;</span>..., 1<span class="o">)</span> <span class="o">=</span> 0 close<span class="o">(</span>3<span class="o">)</span> <span class="o">=</span> 0 rt_sigprocmask<span class="o">(</span>SIG_BLOCK, <span class="o">[</span>CHLD<span class="o">]</span>, <span class="o">[</span>CHLD<span class="o">]</span>, 8<span class="o">)</span> <span class="o">=</span> 0 rt_sigsuspend<span class="o">([])</span> <span class="o">=</span> ? ERESTARTNOHAND <span class="o">(</span>To be restarted<span class="o">)</span> --- SIGCHLD <span class="o">(</span>Child exited<span class="o">)</span> @ 0 <span class="o">(</span>0<span class="o">)</span> --- rt_sigprocmask<span class="o">(</span>SIG_BLOCK, ~<span class="o">[</span>RTMIN RT_1<span class="o">]</span>, <span class="o">[</span>CHLD<span class="o">]</span>, 8<span class="o">)</span> <span class="o">=</span> 0 rt_sigprocmask<span class="o">(</span>SIG_SETMASK, <span class="o">[</span>CHLD<span class="o">]</span>, ~<span class="o">[</span>KILL STOP RTMIN RT_1<span class="o">]</span>, 8<span class="o">)</span> <span class="o">=</span> 0 <span class="c"># La fin du processus fils (4024)</span> wait4<span class="o">(</span>-1, <span class="o">[{</span>WIFEXITED<span class="o">(</span>s<span class="o">)</span> <span class="o">&amp;&amp;</span> WEXITSTATUS<span class="o">(</span>s<span class="o">)</span> <span class="o">==</span> 0<span class="o">}]</span>, WNOHANG|WSTOPPED, <span class="o">{</span><span class="nv">ru_utime</span><span class="o">={</span>0, 0<span class="o">}</span>, <span class="nv">ru_stime</span><span class="o">={</span>0, 0<span class="o">}</span>, ...<span class="o">})</span> <span class="o">=</span> 4024 gettimeofday<span class="o">({</span>1229629587, 867012<span class="o">}</span>, <span class="o">{</span>0, 0<span class="o">})</span> <span class="o">=</span> 0 ioctl<span class="o">(</span>10, SNDCTL_TMR_TIMEBASE or TCGETS, <span class="o">{</span>B38400 opost isig icanon <span class="nb">echo</span> ...<span class="o">})</span> <span class="o">=</span> 0 ioctl<span class="o">(</span>10, TIOCGPGRP, <span class="o">[</span>4024<span class="o">])</span> <span class="o">=</span> 0 ioctl<span class="o">(</span>10, TIOCSPGRP, <span class="o">[</span>3982<span class="o">])</span> <span class="o">=</span> 0 ioctl<span class="o">(</span>10, TIOCGWINSZ, <span class="o">{</span><span class="nv">ws_row</span><span class="o">=</span>38, <span class="nv">ws_col</span><span class="o">=</span>127, <span class="nv">ws_xpixel</span><span class="o">=</span>1270, <span class="nv">ws_ypixel</span><span class="o">=</span>758<span class="o">})</span> <span class="o">=</span> 0 wait4<span class="o">(</span>-1, 0xbfe3f48c, WNOHANG|WSTOPPED, 0xbfe3f434<span class="o">)</span> <span class="o">=</span> -1 ECHILD <span class="o">(</span>No child processes<span class="o">)</span> <span class="c"># Il se demande quelle heure est il :-)</span> <span class="nb">time</span><span class="o">(</span>NULL<span class="o">)</span> <span class="o">=</span> 1229629587 ioctl<span class="o">(</span>10, TIOCSPGRP, <span class="o">[</span>3982<span class="o">])</span> <span class="o">=</span> 0 fstat64<span class="o">(</span>0, <span class="o">{</span><span class="nv">st_mode</span><span class="o">=</span>S_IFCHR|0620, <span class="nv">st_rdev</span><span class="o">=</span>makedev<span class="o">(</span>136, 3<span class="o">)</span>, ...<span class="o">})</span> <span class="o">=</span> 0 fcntl64<span class="o">(</span>0, F_GETFL<span class="o">)</span> <span class="o">=</span> 0x2 <span class="o">(</span>flags O_RDWR<span class="o">)</span> <span class="c"># Il se demande sous quel UID il tourne</span> getuid32<span class="o">()</span> <span class="o">=</span> 1000 <span class="c"># Il reécris le prompt</span> write<span class="o">(</span>1, <span class="s2">&quot;\33]0;phil@philpep.ath.cx ~\7&quot;</span>..., 26<span class="o">)</span> <span class="o">=</span> 26 rt_sigprocmask<span class="o">(</span>SIG_BLOCK, <span class="o">[</span>CHLD<span class="o">]</span>, <span class="o">[</span>CHLD<span class="o">]</span>, 8<span class="o">)</span> <span class="o">=</span> 0 <span class="c"># Il se redemande quelle heure il est</span> <span class="nb">time</span><span class="o">(</span>NULL<span class="o">)</span> <span class="o">=</span> 1229629587 rt_sigaction<span class="o">(</span>SIGINT, <span class="o">{</span>0x80a8fd0, <span class="o">[]</span>, SA_INTERRUPT<span class="o">}</span>, NULL, 8<span class="o">)</span> <span class="o">=</span> 0 write<span class="o">(</span>10, <span class="s2">&quot;\33[1m\33[3m%\33[23m\33[1m\33[0m &quot;</span>..., 149<span class="o">)</span> <span class="o">=</span> 149 <span class="nb">time</span><span class="o">(</span>NULL<span class="o">)</span> <span class="o">=</span> 1229629587 <span class="c"># Il ouvre le fichier /etc/localtime</span> stat64<span class="o">(</span><span class="s2">&quot;/etc/localtime&quot;</span>, <span class="o">{</span><span class="nv">st_mode</span><span class="o">=</span>S_IFREG|0644, <span class="nv">st_size</span><span class="o">=</span>2945, ...<span class="o">})</span> <span class="o">=</span> 0 ioctl<span class="o">(</span>10, FIONREAD, <span class="o">[</span>0<span class="o">])</span> <span class="o">=</span> 0 ioctl<span class="o">(</span>10, TIOCSPGRP, <span class="o">[</span>3982<span class="o">])</span> <span class="o">=</span> 0 ioctl<span class="o">(</span>10, SNDCTL_TMR_STOP or TCSETSW, <span class="o">{</span>B38400 opost isig -icanon -echo ...<span class="o">})</span> <span class="o">=</span> 0 write<span class="o">(</span>10, <span class="s2">&quot;</span> <span class="s2">\33[0m\33[23m\33[24m\33[J\33[01;30m[\33[01;3&quot;</span>..., 105<span class="o">)</span> <span class="o">=</span> 105 write<span class="o">(</span>10, <span class="s2">&quot;\33[K\33[81C \33[01;30m18/12/08 20:46:&quot;</span>..., 46<span class="o">)</span> <span class="o">=</span> 46 <span class="c"># Il attend une nouvelle saisie</span> <span class="nb">read</span><span class="o">(</span>10, Process 3982 detached </pre></div> <p>(Là j'ai viré pas mal de lignes répétitives sur les signaux reçus par le processus)</p> <p>Bon, vous voyez qu'il y a un tas d'appel système, et encore il a fait un fork(), c'est à dire qu'un nouveau processus a été crée... Pour suivre aussi les nouveaux processus il suffit d'un :</p> <div class="codehilite"><pre>% strace -f -pPID </pre></div> <p>Attention, le log peut être très long, donc je vous conseille d'envoyer tout ça dans un fichier, pour donner un ordre d'idée, un simple chargement d'une page dans firefox donne plus de 59000 appels systèmes.</p> <div class="codehilite"><pre>% strace -f -pPID &gt; strace.log 2&gt;&amp;1 </pre></div> <p>Avec ces informations vous pouvez faire du debugage (je me suis rendu compte que mon shell ne fermais pas ses fichiers quand il ne trouvais pas de complétion possible. C'est aussi grâce a ce genres de vérification qu'on s'est rendu compte que le charmant logiciel propriétaire skype ouvrait le fichier bookmaks.html (les favoris de firefox) et les envoyais à la maison mère... C'est une façon rapide de prouver qu'un logiciel propriétaire est malveillant.</p>