Newsgroup: it.comp.lang.perl
Titolo: Script di amministrazione

Salve,
volevo segnalarvi il mio problema.
Devo fare un form CGI che acceda in scrittura al file /etc/passwd. Il
problema e' che gli script cgi vengono eseguiti con i diritti
dell'utente nobody (per default dell'HTTP); quindi non riesco ad
accedervi in scrittura (al massimo in lettura....); Ho provato ad
impostare lo user dell'http come root ma questo non e' consentito per
ovvie ragioni di sicurezza (chiunque che esegue uno script lo
eseguirebbe come root); ho provato ad impostare lo script con lo
set-user-id di root ma anche questo non e' possibile.
Cosa devo fare?
Grazie
Diego
--
Posted from 
ciop.dsi.unive.it
 [157.138.20.15]
via Mailgate.ORG Server - 
http://www.mailgate.org

 Cosa devo fare?
Dipende cosa vuoi fare con /etc/passwd.
Se vuoi cambiare la password via Web, c'e' uno script che fa proprio questo
sul sito di The Perl Journal 
http://tpj.com
, nella directory relativa al
numero 10 della rivista.
In pratica, in quel caso, lo script non gira mai come root ma cambia la
password usando 'su' e il modulo 
chat2.pl
 (ora dovresti usare Expect.pm)
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@usa.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)


		attenzione: rispondere solo a questo indirizzo!
 
	An NT server can be run by an idiot, and usually _is_.

 wrote:
: eseguirebbe come root); ho provato ad impostare lo script con lo
: set-user-id di root ma anche questo non e' possibile.
A parte che la soluzione migliore e` sicuramente quella segnalata da
Maurizio, mi sembra comunque strano che non sia possibile eseguire un
CGI suid root (a meno che l'amministratore del sistema non abbia
disabilitato questa possibilita`).
-- 
Nando Santagata: Telemastica & infornatica
Key fingerprint = C2 D9 C0 8E D5 B7 04 97  AF E8 3F 3E AF 4E 7F 9E
finger nando (at) ns (dot) ipers (dot) net   for my PGP public key
Home: 
http://www.ipers.net/~nandos

 disabilitato questa possibilita`).
Se la macchina e' una delle (tante) macchine Unix che non hanno
script setuid sicuri (e.g Solaris ce li ha, HP-UX e Linix no),
(suid)perl si rifiuta di funzionare finche' gli script setuid non
vengono
disabilitati nel kernel.
Una soluzione puo' essere un programma setuid del tipo:
/*
 * Author: alessandro Forghieri
 * Wrapper for setuid programs to run under the world wide web
 */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
extern int errno;
/*
 * Version control
 */
static char RCSId[]="$Id: sourceweb.c,v 1.1.1.1 1998/11/24 08:53:03 alf
Exp $";
#ifndef REAL_PROGRAM
#error "You must define a program to run"
#endif
#ifndef RUN_AS
#error "You must define a user to run under"
#endif
#ifndef CONTENT_TYPE
#define CONTENT_TYPE "text/plain"
#endif
#ifndef NOSETUID_MSG
#define NOSETUID_MSG "Cannot set user id, reason:"
#endif
#ifndef CANTEXEC_MSG
#define CANTEXEC_MSG "Connot exec " REAL_PROGRAM " reason:"
#endif
int main(int argc, char **argv) {
  /*
   * Unbuffer standard streams
   */
  setbuf(stdin ,(char *)NULL);
  setbuf(stdout,(char *)NULL);
  setbuf(stderr,(char *)NULL);
 
  if ((setuid((uid_t)RUN_AS))==-1) {
    fprintf(stdout,"Content-type: %s\n\n", CONTENT_TYPE);
    fprintf(stdout,"%s\n%s\n", NOSETUID_MSG, strerror(errno));
    exit(1);
  }
  /*
   * Now do it
   */
  argv[0]=REAL_PROGRAM;
  execv(REAL_PROGRAM,argv);
  /*
   * If it gets here, we lost
   */
 
  fprintf(stdout,"Content-type: %s\n\n", CONTENT_TYPE);
  fprintf(stdout,"%s\n%s\n", CANTEXEC_MSG, strerror(errno));
  exit(2);
}
Dove a setuid si puo' dover sostituire una delle altre set*uid, a
seconda del sistema su cui si compila. 
Penso esistano anche altri pacchetti per fare la stessa cosa in modo
meno 
brutale...
Cheers,
	Alessandro