<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blogmotion &#187; bash</title>
	<atom:link href="http://blogmotion.fr/tag/bash/feed" rel="self" type="application/rss+xml" />
	<link>http://blogmotion.fr</link>
	<description>Culture web et nouvelles technologies informatiques</description>
	<lastBuildDate>Wed, 09 May 2012 08:15:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<meta name="generator" content="WordPress" />
	<atom:link rel='hub' href='http://blogmotion.fr/?pushpress=hub'/>
		<item>
		<title>Lister les cron job de tous les utilisateurs Linux</title>
		<link>http://blogmotion.fr/systeme/list-cron-job-all-users-4395</link>
		<comments>http://blogmotion.fr/systeme/list-cron-job-all-users-4395#comments</comments>
		<pubDate>Thu, 12 Nov 2009 23:32:31 +0000</pubDate>
		<dc:creator>Mr Xhark</dc:creator>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[liste]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[tache]]></category>
		<category><![CDATA[utilisateur]]></category>

		<guid isPermaLink="false">http://blogmotion.fr/?p=4395</guid>
		<description><![CDATA[Les Cron (tâches) sont rattachés à un utilisateur système sous le système d&#8217;exploitation Linux. Par mesure de sécurité il est fortement conseillé d&#8217;exécuter ces crons sous un autre utilisateur que root. Dans le cas où vous faites de la maintenance sur des serveurs ne vous appartenant pas, cela devient vite un casse tête de trouver [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-4396" style="border: 1px solid #ccc; margin: 10px;" title="cron-linux" src="http://blogmotion.fr/wp-content/uploads/2009/11/cron-linux.png" alt="cron-linux" width="100" height="100" />Les <a title="Modifier l’éditeur de texte par défaut Linux (crontab)" href="http://blogmotion.fr/systeme/modifier-lediteur-de-texte-par-defaut-linux-crontab-1745">Cron</a> (tâches) sont rattachés à un utilisateur système sous le système d&#8217;exploitation Linux.</p>
<p>Par mesure de sécurité il est fortement conseillé d&#8217;exécuter ces crons sous un autre utilisateur que root. Dans le cas où vous faites de la maintenance sur des serveurs ne vous appartenant pas, cela devient vite un casse tête de trouver <strong>quel utilisateur exécute ces tâches ?</strong></p>
<p>A titre de rappel, la commande pour <strong>lister les cron job de l&#8217;utilisateur courant</strong> :</p>
<pre class="brush: bash; title: ; notranslate"># crontab -l</pre>
<p><strong>Pour lister les cron job d&#8217;un autre utilisateur</strong> que l&#8217;utilisateur courant :</p>
<pre class="brush: bash; title: ; notranslate"># crontab -u nom_utilisateur -l</pre>
<p>A condition toutefois d&#8217;avoir les droits de lecture sur le fichier, ce qui peut ne pas être le cas pour tous les utilisateurs.</p>
<p>Je vous propose de <strong>lister les tâches de tous les utilisateurs</strong> (listés dans /etc/passwd). Définissons un alias depuis l&#8217;utilisateur root :</p>
<pre class="brush: bash; title: ; notranslate"># alias cronall='for user in $(cut -f1 -d: /etc/passwd); do echo -e &quot;\n\n==&gt; $user:&quot; &amp;&amp; crontab -u $user -l; done'</pre>
<p>Il vous suffit ensuite de faire appel à <em>cronall</em><span id="more-4395"></span> :</p>
<pre class="brush: bash; title: ; notranslate"># cronall

==&gt; root:
# m h  dom mon dow   command
30 23 * * * df &gt;&gt; test_blogmotion.fr

==&gt; daemon:
no crontab for daemon

==&gt; bin:
no crontab for bin

==&gt; sys:
no crontab for sys

==&gt; sync:
no crontab for sync

==&gt; mail:
no crontab for mail

==&gt; www-data:
no crontab for www-data

==&gt; backup:
no crontab for backup
</pre>
<p>Les tâches sont listées par utilisateur, plutôt pratique. Dans mon cas, seul l&#8217;utilisateur root possédait un cron job.</p>
<p><span style="text-decoration: underline;">Attention</span> : ce script ne fonctionne pas sur les crons périodiques (cron.daily, cron.weekly, etc.) qui sont dans des répertoires distincts et non liés à un utilisateur mais au système. Pour <strong>lister ces crons</strong> une commande simple suffira pour trouver ce que vous cherchez :</p>
<pre class="brush: bash; title: ; notranslate">cat /etc/cron.d/* | grep &quot;votre recherche&quot;</pre>
<p>De même que pour <strong>lister tous les scripts</strong> (sans le contenu) :</p>
<pre class="brush: bash; title: ; notranslate">ls -al /etc/cron.*</pre>
<p><a href="http://stackoverflow.com/questions/134906/how-do-i-list-all-cron-jobs-for-all-users"><em>Source d&#8217;inspiration du premier script</em></a></p>
Vous devriez me suivre sur Twitter : <strong><a href="http://twitter.com/xhark">@xhark</a></strong>
<hr />
<p><small><a href="http://blogmotion.fr/systeme/list-cron-job-all-users-4395">Article original</a> écrit par Mr Xhark publié sur <a href="http://blogmotion.fr">Blogmotion</a> le 13/11/2009 |
<a href="http://blogmotion.fr/systeme/list-cron-job-all-users-4395#comments">5 commentaires</a> |
<br />Attention : l'intégralité de ce billet est protégée par la licence <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/">Creative Commons</a> 
</small></p>]]></content:encoded>
			<wfw:commentRss>http://blogmotion.fr/systeme/list-cron-job-all-users-4395/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Exécuter un script shell avec permission root en PHP</title>
		<link>http://blogmotion.fr/systeme/executer-un-script-shell-avec-permission-root-en-php-1312</link>
		<comments>http://blogmotion.fr/systeme/executer-un-script-shell-avec-permission-root-en-php-1312#comments</comments>
		<pubDate>Thu, 30 Oct 2008 17:25:44 +0000</pubDate>
		<dc:creator>Mr Xhark</dc:creator>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bind]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[droits]]></category>
		<category><![CDATA[exécuter]]></category>
		<category><![CDATA[fichier]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[permission]]></category>
		<category><![CDATA[redémarrer]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blogmotion.fr/?p=1312</guid>
		<description><![CDATA[Il peut arriver d&#8217;avoir besoin d&#8217;automatiser des actions sur un serveur linux via une page web, typiquement en PHP. Ne trouvant que peu de documentation sur ce principe, je vous propose une solution qui devrait fonctionner sur la majorité des serveurs (testée sous Debian et Ubuntu pour mon cas). Nous allons dans cet exemple redémarrer [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="alignright size-full wp-image-1314" style="margin: 10px;" title="apache-as-root" src="http://blogmotion.fr/wp-content/uploads/2008/10/apache-as-root.png" alt="" width="156" height="157" />Il peut arriver d&#8217;avoir besoin d&#8217;automatiser des actions sur un serveur linux via une page web, typiquement en PHP. Ne trouvant que peu de documentation sur ce principe, je vous propose une solution qui devrait fonctionner sur la majorité des serveurs (testée sous Debian et Ubuntu pour mon cas).</p>
<p style="text-align: justify;">Nous allons dans cet exemple redémarrer le service DNS (Bind9) grâce à un formulaire html exécutant cette fameuse commande via un bout de code PHP.<span id="more-1312"></span></p>
<h3 style="text-align: justify;">Identifier l&#8217;utilisateur Apache</h3>
<p style="text-align: justify;">Les scripts PHP interprétés par Apache sont exécutés par un utilisateur système. Généralement il s&#8217;agit de &laquo;&nbsp;<strong>www-data</strong>&laquo;&nbsp;, mais il peut varier selon les distributions et configurations. Pour récupérer ce nom d&#8217;utilisateur vous avez trois solutions :</p>
<ol>
<li style="text-align: justify;">Ouvrir le fichier de configuration Apache &laquo;&nbsp;<strong>apache2.conf</strong>&laquo;&nbsp;, généralement situé dans <strong>/etc/apache2/apache2.conf</strong> (si vous le ne trouvez pas faites un &laquo;&nbsp;locate apache2.conf&nbsp;&raquo; il devrait vous indiquer son emplacement). Dans le premier quart tu fichier vous devriez trouver l&#8217;information voulue : <img class="alignnone size-full wp-image-1313" style="border: 1px solid #ccc;" title="apache2conf-username" src="http://blogmotion.fr/wp-content/uploads/2008/10/apache2conf-username.png" alt="" width="321" height="127" /></li>
<li style="text-align: justify;">Ouvrir le fichier des utilisateurs systèmes /etc/group/ et cherchez celui qui semble correspondre</li>
<li style="text-align: justify;">Lancer le service Apache (en root : <strong>/etc/init.d/apache2 start</strong>) puis faites un : <strong>ps aux | grep apache2</strong>. Vous devriez avoir le nom d&#8217;utilisateur sous lequel le service fonctionne.</li>
</ol>
<h3 style="text-align: justify;">Le fichier sudoers</h3>
<p style="text-align: justify;">Nous allons utiliser la commande sudo qui va permettre à l&#8217;utilisateur Apache (www-data pour mon cas) de lancer une commande qui n&#8217;est habituellement exécutable qu&#8217;en root. Je vous conseilel de <a href="http://doc.ubuntu-fr.org/sudo">lire cette documentation</a> si vous n&#8217;avez jamais entendu parlé de <strong>sudo</strong>.</p>
<p style="text-align: justify;">Editez le fichier <strong>/etc/sudoers </strong>via la commande<strong> visudo</strong> (il est fortement déconseiller de l&#8217;éditer directement), puis trouvez cette ligne :<br />
<p style="border-left: 5px solid rgb(195, 215, 234); padding: 5px 20px 5px 10px; background: rgb(240, 240, 240) url(http://blogmotion.fr/wp-content/plugins/NiceWeb2CSS/icon/noicon.gif) no-repeat scroll 10px 5px; font-family: Courier New,Courier,mono,times new roman; line-height: 150%; color: rgb(102, 102, 102);">root    ALL=(ALL) ALL</p></p>
<p style="text-align: justify;">En dessous de cette ligne ajoutez :<br />
<p style="border-left: 5px solid rgb(195, 215, 234); padding: 5px 20px 5px 10px; background: rgb(240, 240, 240) url(http://blogmotion.fr/wp-content/plugins/NiceWeb2CSS/icon/noicon.gif) no-repeat scroll 10px 5px; font-family: Courier New,Courier,mono,times new roman; line-height: 150%; color: rgb(102, 102, 102);"><span style="color: #ff0000;"><strong>www-data</strong></span> ALL=(ALL) NOPASSWD:/etc/init.d/bind9 restart</p>
</p>
<p style="text-align: justify;">Pensez à remplacer <span style="color: #ff0000;"><strong>www-data </strong><span style="color: #000000;">par votre utilisateur s&#8217;il diffère (cf. première étape).</span></span></p>
<p style="text-align: justify;">Grâce à cette ligne nous autorisons l&#8217;utilisateur d&#8217;Apache a exécuter cette commande, et uniquement celle-ci ! C&#8217;est un point important sur la sécurité de votre système. Dans le cas contraire sachez que la <strong>sécurité de votre système serait totalement compromise</strong> :<br />
<p style="border-left: 5px solid rgb(195, 215, 234); padding: 5px 20px 5px 10px; background: rgb(240, 240, 240) url(http://blogmotion.fr/wp-content/plugins/NiceWeb2CSS/icon/noicon.gif) no-repeat scroll 10px 5px; font-family: Courier New,Courier,mono,times new roman; line-height: 150%; color: rgb(102, 102, 102);"><span style="color: #ff0000;"><strong>www-data</strong></span> ALL=(ALL) NOPASSWD:ALL</p>
</p>
<p style="text-align: justify;">Dans ce cas précis, vous autorisez <strong>toutes les commandes du systèmes</strong> à être exécutées par votre utilisateur Apache, bien évidemment c&#8217;est fortement déconseillé !</p>
<h3 style="text-align: justify;">Le cas d&#8217;un script shell</h3>
<p>Si vous préférez exécuter un script (.sh) qui s&#8217;occupera lui même de réaliser cette opération, il vous faut placer dans votre fichier <strong>/etc/sudoers</strong> (toujours via la commande <strong>visudo</strong>) le code suivant (ignorer dans ce cas la première manipulation) :</p>
<p><p style="border-left: 5px solid rgb(195, 215, 234); padding: 5px 20px 5px 10px; background: rgb(240, 240, 240) url(http://blogmotion.fr/wp-content/plugins/NiceWeb2CSS/icon/noicon.gif) no-repeat scroll 10px 5px; font-family: Courier New,Courier,mono,times new roman; line-height: 150%; color: rgb(102, 102, 102);"><strong><span style="color: #ff0000;">www-data</span></strong> ALL=(ALL) NOPASSWD: DNSRELOAD<br />
<span style="color: #ff0000;"><span style="color: #000000;"># Cmnd alias specification<br />
Cmnd_Alias DNSRELOAD = /chemin/vers/votre/script.sh</span></span></p></p>
<p>D&#8217;une façon générale :<br />
<strong><span style="color: #ff0000;"><span style="color: #000000;">Cmnd_Alias NomDeVotreAlias = NomDeVotreAlias ListeDeCommandesSepareesParDesVirgules<br />
OU (dans le cas d&#8217;un script)<br />
</span></span></strong><strong><span style="color: #ff0000;"><span style="color: #000000;">Cmnd_Alias NomDeVotreAlias = NomDeVotreAlias /chemin/vers/votre/script/</span></span></strong></p>
<p>Le script s&#8217;exécutant &laquo;&nbsp;en tant que&nbsp;&raquo; root vous ne devriez pas avoir de souci de droits, dans le cas contraire :<br />
<p style="border-left: 5px solid rgb(195, 215, 234); padding: 5px 20px 5px 10px; background: rgb(240, 240, 240) url(http://blogmotion.fr/wp-content/plugins/NiceWeb2CSS/icon/noicon.gif) no-repeat scroll 10px 5px; font-family: Courier New,Courier,mono,times new roman; line-height: 150%; color: rgb(102, 102, 102);">#: chown <span style="color: #ff0000;"><strong>www-data</strong></span>:<span style="color: #ff0000;"><strong>www-data</strong></span> /chemin/vers/votre/script.sh</p></p>
<p>Vous pouvez également faire plus simple en sautant ces étapes pour directement placer le code suivant dans <strong>/etc/sudoers </strong>(mais les possibilités de &laquo;&nbsp;dérives&nbsp;&raquo; vers d&#8217;autres utilisations sont moins nombreuses) :<br />
<p style="border-left: 5px solid rgb(195, 215, 234); padding: 5px 20px 5px 10px; background: rgb(240, 240, 240) url(http://blogmotion.fr/wp-content/plugins/NiceWeb2CSS/icon/noicon.gif) no-repeat scroll 10px 5px; font-family: Courier New,Courier,mono,times new roman; line-height: 150%; color: rgb(102, 102, 102);"><strong><span style="color: #ff0000;">www-data</span></strong> ALL=(ALL) NOPASSWD: /chemin/vers/votre/script.sh</p></p>
<h3>L&#8217;exécution du script PHP</h3>
<p>Il vous suffira ensuite de lancer la commande grâce à la fonction <a href="http://php.net/exec/">exec</a> de <a href="http://php.net">PHP</a>. Dans le cas ou vous souhaitez relancer Bind <strong>sans</strong> script (.sh) :<br />
<p style="border-left: 5px solid rgb(195, 215, 234); padding: 5px 20px 5px 10px; background: rgb(240, 240, 240) url(http://blogmotion.fr/wp-content/plugins/NiceWeb2CSS/icon/noicon.gif) no-repeat scroll 10px 5px; font-family: Courier New,Courier,mono,times new roman; line-height: 150%; color: rgb(102, 102, 102);">&lt;?PHP exec(&#8216;sudo -u <span style="color: #ff0000;"><strong>www-data</strong></span> /etc/init.d/bind9 restart&#8217;); exit; ?&gt;</p></p>
<p>Dans le cas ou vous utilisez un script :<br />
<p style="border-left: 5px solid rgb(195, 215, 234); padding: 5px 20px 5px 10px; background: rgb(240, 240, 240) url(http://blogmotion.fr/wp-content/plugins/NiceWeb2CSS/icon/noicon.gif) no-repeat scroll 10px 5px; font-family: Courier New,Courier,mono,times new roman; line-height: 150%; color: rgb(102, 102, 102);">&lt;?PHP exec(&#8216;sudo -u <span style="color: #ff0000;"><strong>www-data</strong></span> /chemin/vers/votre/script.sh&#8217;); exit; ?&gt;</p></p>
<p>Pensez à remplacer <span style="color: #ff0000;"><strong>www-data </strong><span style="color: #000000;">par votre utilisateur Apache s&#8217;il diffère <img src='http://blogmotion.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </span></span></p>
<h3>Conclusion</h3>
<p style="text-align: justify;">Il ne vous reste plus faire un petit formulaire (x)html très simple avec un bouton &laquo;&nbsp;Redémarrer Bind&nbsp;&raquo; et le tour est joué ! Sachez que cette technique fonctionne même si vous avez Suhosin-patch d&#8217;installé.</p>
<p style="text-align: justify;">Si toutefois cette solution ne vous convient pas, il vous reste la solution des <a href="http://www.xgarreau.org/aide/admin/suscript/">scripts SUID</a>, à condition dans ce cas d&#8217;avoir solides connaissances en matière de <a href="http://www.lea-linux.org/cached/index/Admin-admin_env-permissions.html">permissions sur les fichiers</a>.</p>
Vous devriez me suivre sur Twitter : <strong><a href="http://twitter.com/xhark">@xhark</a></strong>
<hr />
<p><small><a href="http://blogmotion.fr/systeme/executer-un-script-shell-avec-permission-root-en-php-1312">Article original</a> écrit par Mr Xhark publié sur <a href="http://blogmotion.fr">Blogmotion</a> le 30/10/2008 |
<a href="http://blogmotion.fr/systeme/executer-un-script-shell-avec-permission-root-en-php-1312#comments">10 commentaires</a> |
<br />Attention : l'intégralité de ce billet est protégée par la licence <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/">Creative Commons</a> 
</small></p>]]></content:encoded>
			<wfw:commentRss>http://blogmotion.fr/systeme/executer-un-script-shell-avec-permission-root-en-php-1312/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

