2009/1/21 JuanJo Ciarlante <[email protected]>: > On Tue, Jan 20, 2009 at 11:33:09AM -0500, Gonzalo Aguirre wrote: >> hola lista! >> estoy haciendo un script en perl para gestionar un dispositivo de >> forma remota (por web). La idea es poder variar algunos parámetros, >> deshabilitarlo, habilitarlo, etc. >> >> El dispositivo se habilita y deshabilita con `ifconfig' (es un >> puerto CAN) y para poder variar los parámetros accedo a través de >> SYSFS. Como el script está como un cgi-bin me los ejecuta con el >> usuario www-data y no cuento con los provilegios suficientes para >> poder escribir en un archivo del SYSFS o habilitar/deshabilitar el >> dispositivo. >> >> Seguramente lo más bestía sería cambiar el usuario de apache, pero >> comprometería el sistema. También como alternativa hacer que se >> ejecute un script en `expect' que haga un `su' pero tampoco me >> convence mucho. > > pliz NOOOoo > >> Alguno/a conoce alguna manera más sutil hacer ejecutar >> un cgi-bin como root? > > Tenés que pensar en priv-sep (priviledge separation): dos > procesos con UIDs distintas (www-data | root) que se comunican > por algún medio.
finalmente opté por comunicarlo mediante sockets, la verdad que es una solución bastante limpia e intuitiva! En todo momento se puede ver qué hace cada parte y en caso de error no es complicado resolverlo. > Fijate en este post lo explico bien (ejemplo c/código incluído): > http://www.lugmen.org.ar/pipermail/lug-devel/2004-November/000450.html > cortita: corrés un daemon como root, escuchando en un puerto local, > esperando comandos explícitos y bien "acotados". Me basé en las plantillas-script del post de jjo. Y el único inconveniente que tuve fue que me olvidé de poner el script en /usr/local/sbin con permiso +x (solucionable con un chmod), pero en el log /var/log/daemon.log salió inmediatamente. La parte del cliente la hice en Perl, seguramente habrán más alternativas pero es la que más conozco y me siento más cómodo, hago un copy&paste >># cat cli_sck.pl #!/usr/bin/perl use IO::Socket; my $sock = new IO::Socket::INET (PeerAddr => 'localhost', PeerPort => 6969, Proto => 'tcp'); die "Could not create socket: $!\n" unless $sock; #print $sock "stop can0 0"; print $sock "start can0 125000"; close($sock); Antes de ponerse a hacer código del cliente, también es bastante cómodo poder largar algunos comando por telnet para ver cómo responde el daemon (y si es que responde!!) De las plantillas agregué ni saqué ninguna opción. Gracias muchachos, y espero que les sea útil! Saludos! -- Gonzalo Aguirre "Поумру с сажень, в иолдень - с иядень, а к вецеру цереэ иоле хвамаем?"
