Newsgroup: it.comp.os.linux.iniziare
Titolo: Help per shell script

Vorrei creare uno script il quale, ogni volta che si va online, esegue
altri script contenuti in una directory .on_ipup contenuta nella home
dell'utente che ha avviato la connessione (o eventualmente di tutti
gli utenti).
Avevo pensato a qualcosa come:
#!/bin/sh
[ -d /home/$???/.on_ipup ] || exit 0
for script in /home/$???/.on_ipup*; do
    sh $script
done
Il tutto ovviamente in /etc/ppp/ip-up.d. 
Il problema e` $???, che dovrebbe rappresentare l'utente che ha
avviato la connessione.  Esiste una variabile del genere?  ``$''
seguito da due tab non mi ha suggerito niente di utile.
Alternativamente, esiste un comando che elenchi gli utenti del
sistema?  In questo modo si potrebbero eseguire gli script nelle
.on_ipup di tutti gli utenti.  (un ``for /home/* ...'' non va perche'
in home c'e` anche lost+found).
Massimiliano

 perche' in home c'e` anche lost+found).
Questo in compenso e` fattibile e facile: di primo acchito direi che un
    cat /etc/passwd | grep "home/" | grep "bash$" | cut -d ":" -f 6
ti restituisce la lista di tutte le home directory effettivamente usate.
Naturalmente al posto di "bash" puoi metterci qualcosa di piu` completo:
era solo per fare un esempio.
-- 
  _      ___ ____
 | | /| / (_)_  / >>> aka Luciano Di Lucrezia
 | |/ |/ / / / /_   . Radiance BBS: 
+39-0362-332921
 - JOIN THE FUN NOW!
 |__/|__/_/ /___/   . Ban Micro$oft from Universities! Support Free Software.
 
My love for her will help me find my way. (Queensryche)

 seguito da due tab non mi ha suggerito niente di utile.
${HOME} contiene il path per la home dell'utente sotto il quale gira
lo script, se e' questo che ti serve.
Se ti servono i nomi di tutti gli utenti sul sistema al momento:
ACTIVE=`who | cut -f 1 -d ' ' | sort | uniq`
che ti permette di fare:
for USR in ${ACTIVE}; do
  if [ -d /home/${USR} ]; then
  ...
  fi
done
o qualcosa di simile.
NOTA: usa USR e non USER, perche' USER e' ls variabile che contiente
il nome dell'utente sotto la cui identita' gira lo script.
-- 
Stefano - Hodie decimo septimo Kalendas Novembres MMI est

 Naturalmente al posto di "bash" puoi metterci qualcosa di piu` completo:
Direi che va benissimo cosi`.
Grazie!
Massimiliano

 Se ti servono i nomi di tutti gli utenti sul sistema al momento:
Questo puo` tornarmi utile, grazie. :-)
Curiosita`: come mai racchiudi le variabili tra parentesi graffe?
Massimiliano

 dall'utente che l'ha avviato. Pero` non so come funzioni la cosa.
Non lo sa pppd, lo sa il kernel. pppd gira con UID dell'utente e EUID 0.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Not an editor command: Wq

Curiosita`: come mai racchiudi le variabili tra parentesi graffe?
Altrimenti gli scappano .....
P.S. ci sono punti di uno script dove e' obbligatorio farlo.

 
certo, prova con
$ USERNAME=`whoami`; export $USERNAME
-- 
le faq di it.comp.hardware.video-3d: 
http://www.3ditalia.com/video-3d
``Non ci sono thread in alt.binaries.pictures.erotica, e quindi non c'e'
alcun vantaggio nell'usare un newsreader che gestisca i thread.''

 Il tutto ovviamente in /etc/ppp/ip-up.d. 
l'uovo di colombo
-  per  ogni  utente  che  crei deve  essere  creata  la  corrispondente
   directory anche in /etc/ppp/ip-up.d con i dovuti diritti di accesso
  mkdir /etc/ppp/ip-up.d/test
  chmod 770 /etc/ppp/ip-up.d/test
  chgrep ppp /etc/ppp/ip-up.d/test
  (che differenza c'e` tra avere la directory, nella home o in ip-up.d)
 
- lo script diventa (meglio in *ip-up.local*)
#!/bin/sh
cd /etc/ppp/ip-up.d
for u in `ls`
do
	for s in `ls $u`
	do
		sh $s
	done
done
Se poi usi la tecnica di *init* allora oltre a *ip-up.d* avranno anche:
		*ip-down.d*
-- 
Mario Michele Macaluso     -o)  | Hummingbirds never remember the words to   
m.macaluso .@. 
libero.it
   /\\  | songs.                                     
                          _\\_v |                                            
Kernel 2.2.14-5.0 on a i586     |                                            
(All addresses in headers are fake. Only one dot in signature.)

 P.S. ci sono punti di uno script dove e' obbligatorio farlo.
Be', almeno e` un indizio. :-)
Massimiliano

 $ USERNAME=`whoami`; export $USERNAME
Non capisco.  Dove dovrebbe andare la riga qui sopra?  Non certo nello
script che parte da /etc/ppp/ip-up.d, visto che gira come root.
:-?
Massimiliano

 Non lo sa pppd, lo sa il kernel. pppd gira con UID dell'utente e EUID 0.
E c'e` modo di estorcere questa informazione al kernel?
Massimiliano

 Curiosita`: come mai racchiudi le variabili tra parentesi graffe?
(Fai finta che lo sapessi da prima e non l'avessi appena letto su man
bash)
In alcuni casi, per esempio negli array, e' obbligatorio, altrimenti
si potrebbero creare conflitti, 
p.es
. non si potrebbe decidere se
$pippo[10] indica l'elemento 10 dell'array pippo o un file il cui nome
e' formato dal contenuto della variabile $pippo piu' un 1 o uno 0
(come in "ls file[12]"). Scrivendo ${pippo[10]} non c'e' ambiguita'.
Non e' necessario ovunque, ma in generale rende gli aggiornamenti
dello script un pochino piu' facili, per esempio se si vogliono dare
dei valori di default alle variabili le {} servono.
Altri esempi in man bash, cerca "pathname expansion". 
-- 
Stefano - Hodie decimo sexto Kalendas Novembres MMI est

ba...@prism.localnet (Massimiliano Mirra) writes:

echo $UID
echo $EUID
(con o senza {}...)


 		*ip-down.d*
Chi avra` anche ip-down.d?
Riassumendo: prima avrei creato uno script in ip-up.d che richiamasse
script contenuti nelle home directory degli utenti.  Invece posso
semplicemente creare in ip-up.d una directory con i permessi
dell'utente a cui voglio permettere questo tipo di funzione, e in tale
directory porre gli script che lui vuole siano eseguiti a connessione
avvenuta.  Giusto?
Massimiliano

   (che differenza c'e` tra avere la directory, nella home o in ip-up.d)
Non so, e` usanza che gli utenti abbiano qualcosa su cui mettere le
mani in /etc?  Pensavo che il loro raggio di azione dovesse limitarsi
alle home.
Massimiliano

 (Fai finta che lo sapessi da prima e non l'avessi appena letto su man
:-)
[spiegazione] anzi, ${spiegazione}
Bueno, muchas gracias.  Che esistessero gli array in bash non lo
sapevo neppure. :-)
Massimiliano

 echo $EUID
In questo modo pero` ti dice gli UID della shell, non di pppd. A meno
che forse, richiamandoli dentro a ip-up.d...
-- 
  _      ___ ____
 | | /| / (_)_  / >>> aka Luciano Di Lucrezia
 | |/ |/ / / / /_   . Radiance BBS: 
+39-0362-332921
 - JOIN THE FUN NOW!
 |__/|__/_/ /___/   . Ban Micro$oft from Universities! Support Free Software.
 
Yeah, piece o' cake! (D. Nukem)

 Non lo sa pppd, lo sa il kernel. pppd gira con UID dell'utente e EUID 0.
ps aun | grep pppd, lanciato dallo stesso utente da cui lancio la
connessione, mi da` questo risultato:
    USER   PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
       0  3556  0.0  0.7  1900  924 ttyS0    S    19:35   0:00 /usr/
sbin/pppd call provider
    1000  3653  0.0  0.4  1604  576 tty3     S    19:38   0:00 grep pppd
Risulta quindi che pppd sta girando con UID diverso da quello
dell'utente. :-?
Massimiliano

sapevo neppure. :-)
Ci sono a partire dalla RedHat7.1, nella 6.1 non ci sono, sarebbe meglio
evitarli.
Salve
           Dbg

 alle home.
Massima del giorno:
"Gli utenti sono liberi di  fare tutto cio` che l'amministratore concede
loro di fare."
Quello che si legge in sala macchine:
"L'amministratore e` uno stupido. L'utente puo` fare cio` che vuole solo
se passa sui nostri corpi."
Adesso sai cosa sono autorizzati a fare gli utenti e chi sono i tuoi alleati.
-- 
Mario Michele Macaluso     -o)  | If you would understand your own age, read 
m.macaluso .@. 
libero.it
   /\\  | the works of fiction produced in it.       
                          _\\_v | People in disguise speak freely.           




Semmai ci saranno da una certa versione di bash, non di RedHat...
-- 
Stefano - Hodie decimo quinto Kalendas Novembres MMI est

Semmai ci saranno da una certa versione di bash, non di RedHat...
Certo, ma non sapendo dare le informazioni relative alla bash, avendo
provato solo le redhat e sapendo che a volte le distro personalizzano le
versioni dei vari programmi, ho preferito dare le informazioni certe.
Salve
          Dbg

nelle home degli utenti solo in caso positivo.  Giusto?
Puoi greppare anche l'output di ifconfig.
-- 
	     .
 ____      _ |   UIN:82766812  
|_\|_)  /o( -*-. Fiat500Web: 
http://www.poli.studenti.to.it/~f.sirna
 
|  \ \|\||_) |   mailto: rimuovi l'antispam prima di rispondere
------------ .   On a 486DX/133 with Linux Debian 2.2 (Potato)

 dell'utente. :-?
Si`, pppd gira con i permessi di root (USER 0), mentre il comando "grep
pppd" gira con UID 1000.
UID = User ID, corrisponde all'UID del processo chiamante (nel tuo caso
      quello dalla shell)
EUID = Effective User ID, corrisponde al bit SUID (Set User ID)
      sull'eseguibile.
Nel tuo caso pppd ha UID =  1000 e EUID = 0. Per risalire all'utente che
ha lanciato pppd,  puoi usare questo programma,  richiamato dallo script
lanciato da pppd:
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <sys/types.h>
int main (int argc, char **argv) {
	uid_t uid;
	struct passwd *pwd;
 
	if (argc != 2)
		return EXIT_FAILURE;
	if (sscanf(argv[1], "%d", &uid) < 1)
		return EXIT_FAILURE;
	if ((pwd = getpwuid(uid)) == NULL)
		return EXIT_FAILURE;
	printf("%s", pwd->pw_name); 
	return EXIT_SUCCESS;
}
Il nome utente lo ricavi con usando il programma cosi`:
UTENTE=`/path/nomeprogramma $UID`
HTH
Kronos
-- 
Home: 
http://kronoz.cjb.net
Windows /win'dohz/ n. : thirty-two  bit extension and graphical shell to
a sixteen  bit patch to an  eight bit operating system  originally coded
for a  four bit microprocessor  which was  written by a  two-bit company
that can't stand a bit of competition.

 ha scritto:
[snip code] 
Che bestia che sono... molto meglio cosi`:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>
int main (int argc, char **argv) {
	struct passwd *pwd;
 
	if ((pwd = getpwuid(getuid())) == NULL)
		return EXIT_FAILURE;
	printf("%s", pwd->pw_name); 
	return EXIT_SUCCESS;
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Non ho ancora capito se il mio cane e` maschio o femmina:
quando fa la pipi` si chiude in bagno

 lanciato da pppd:
<gulp>
Grazie infinite per aver addirittura scritto del codice per risolvere
il problema.  *Ma* la mia priorita` e` di fare tutto solo con degli
shell script e wget, anche se e` molto meno flessibile e mi complica
molto piu` la vita che scriverlo in ruby.  No, non e` masochismo, e`
solo esercizio. :-)
Massimiliano

 se passa sui nostri corpi."
LOL
Massimiliano

 Puoi greppare anche l'output di ifconfig.
Suppongo di dover tirar fuori l'indirizzo IP della mia macchina
dall'output di ifconfig e assicurarmi che sia diverso da quello che
avrebbe nella LAN, e` questo che intendevi?  Mi sembra perfetto.
Massimiliano