View Full Version : Bash programming
beppicus
07-06-2004, 08:54
Problema: vorrei far partire in automatico alcuni software all'avvio solo quando il mio portatile è collegato ad internet.
Soluzione: avrei pensato di mettere in /etc/rc.d/rc.local (slackware) una condizione IF che legga il contenuto di /etc/resolv.conf
Infatti quando sono collegato alla rete (universitaria) il client dhcp modifica questo file inserendo (oltre ai DNS) una linea del tipo "search dominio.it".
Come faccio la suddetta condizione IF ? devo usare un GREP ? C'è qualche soluzione migliore?
Grazie e Ciao.
lnessuno
07-06-2004, 09:03
http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
probabilmente il DHCP ti assegnerà un dome di dominio differente, puoi testare quello:
if [ $(domainname) == "dominio.univ" ]
then
#fai quello che devi
fi
lnessuno
07-06-2004, 11:42
else
leggiilmanuale :D
Jøhñ Ðøë
07-06-2004, 12:53
Originariamente inviato da lnessuno
else
leggiilmanuale :D
s'é capito, ma non è che uno può imparare a programmare solo per fare un if.. d'altra parte il forum serve anche a questo... mica è venuto a chiedere cosa fa l'opzione -v di tar :rolleyes: :rolleyes:
lnessuno
07-06-2004, 13:01
Originariamente inviato da Jøhñ Ðøë
s'é capito, ma non è che uno può imparare a programmare solo per fare un if.. d'altra parte il forum serve anche a questo... mica è venuto a chiedere cosa fa l'opzione -v di tar :rolleyes: :rolleyes:
guarda che in quella guida è spiegato anche come fare un semplice if, con esempi...
http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-6.html#ss6.2
beppicus
07-06-2004, 13:44
Ovviamente l'HOWTO l'ho letto...... ma non sono riusctio ad integrare IF con GREP !!! Invece la soluzione con la variabile d'ambiente domainname mi sembra buona e la provo subito.
Grazie a tutti.
Originariamente inviato da beppicus
Ovviamente l'HOWTO l'ho letto...... ma non sono riusctio ad integrare IF con GREP !!! Invece la soluzione con la variabile d'ambiente domainname mi sembra buona e la provo subito.
Grazie a tutti.
ehm ehm non e' una variabile di ambiente, e' l'output di un comando quello ;)
beppicus
07-06-2004, 15:04
Originariamente inviato da kingv
ehm ehm non e' una variabile di ambiente, e' l'output di un comando quello ;)
Ah!!!!! :D :D :D
Ma a me è proprio il comando che manca concettualmente!!! La struttura dell'IF la so (sei sicuro che abbia due uguali?!?! Non è proprio come il C).
Ma forse forse esiste anche la variabile d'ambiente associata al dominio corrente no?!?! :)
del doppio uguale son sicuro, e' l'operatore di confronto tra stringhe. ;)
Non è proprio come il C
Invece è ESATTAMENTE come il C. :cool:
beppicus
07-06-2004, 16:16
Originariamente inviato da figulus
Invece è ESATTAMENTE come il C. :cool:
Allora perchè negli esempi dell'HOWTO ce n'è uno solo?!?!
http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-6.html
Originariamente inviato da beppicus
Allora perchè negli esempi dell'HOWTO ce n'è uno solo?!?!
http://www.tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-6.html
man bash
sono buoni tutti e due.
Psycotic
07-06-2004, 16:48
oppure fai un ping a qualcuno e fai partire quello che ti serve se quel qualcuno ti risponde... tipo il gateway o un dns
beppicus
07-06-2004, 16:51
Originariamente inviato da Psycotic
oppure fai un ping a qualcuno e fai partire quello che ti serve se quel qualcuno ti risponde... tipo il gateway o un dns
Mi sembra decisamente più complesso e meno pratico del leggere /etc/resolv.conf :confused: :confused: :confused: :confused:
Psycotic
07-06-2004, 16:59
Se lo dici tu.....
dipende da cosa vuoi far partire..
sai magari il dhcp ti da qello che deve darti, pero' nn puoi raggiungere l'esterno x qalche altro motivo..... dipende sempre per cosa ti serve...
beppicus
07-06-2004, 17:03
Lavoro in università. Quindi quando arrivo la mattina attacco il portatile e il dhcp mi da l'indirizzo (a questo punto sono sicuro di avere l'accesso ad internet).
Quando la sera a casa lo accendo (senza rete) non vorrei che partissero automaticamente programmi tipo mail, instant messaging, download clients , etc....etc.....
Allora perchè negli esempi dell'HOWTO ce n'è uno solo?!?!
Volevo dire che il confronto tra variabili si fa col doppio uguale esattamente come in C. Con bash però puoi usare un solo uguale. Se fai:
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" == "$T2" ]; then
echo uguali
else
echo diversi
fi
oppure fai:
#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo uguali
else
echo diversi
fi
ottieni lo stesso output, cioé "diversi". Ciaoooo
Originariamente inviato da beppicus
Lavoro in università. Quindi quando arrivo la mattina attacco il portatile e il dhcp mi da l'indirizzo (a questo punto sono sicuro di avere l'accesso ad internet).
Quando la sera a casa lo accendo (senza rete) non vorrei che partissero automaticamente programmi tipo mail, instant messaging, download clients , etc....etc.....
si ma il dhcp ti dara' un indirizzo di una rete privata (tipo 10.x.x.x o 192.168.x.x), mentre quando sei a casa il provider ti "presta" un ip pubblico.
e' il test piu' semplice e significativo che puoi fare, no?
beppicus
07-06-2004, 17:10
Ma c'è qualcuno che mi suggerisce un abbozzo di codice per provare? Che sia basato su un tentativo di Ping o sulla lettura di un file di configurazione non importa.... alla fine se funziona....
Io ho provato con un IF - FGREP ma senza successo :(
Per Kingv:
Dimenticavo di dire che da casa non mi collego mai.
Originariamente inviato da beppicus
Per Kingv:
Dimenticavo di dire che da casa non mi collego mai.
allora devi discriminare tra che cosa, l'università e poi?
cmq prova il mio primo post, quello con domainname, sostituendo a "dominio.univ" quello corretto.
beppicus
07-06-2004, 17:26
:cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry: :cry:
Come discriminare tra cosa e cosa?!?!?!
Ipotesi 1: sono in università collegato alla rete e voglio che all'avvio partano determinati servizi in modo automatico.
Ipotesi 2: sono a casa, al mare o dal barbiere SENZA alcuna rete o connessione e non voglio che nessuno dei suddetti servizi parta!!!
Scusate, ma non mi sembra così difficile.... forse mi spiego male, ma forse non leggete tutto il 3d....
ca**o discriminare tra ipotesi uno e ipotesi due! :mad:
fai così:
in /etc/rc.d/rc.inet 1 ci sara' una riga tipo:
/usr/sbin/dhcpcd
sostituiscila con :
if /usr/sbin/dhcpcd
then
#fai partire i servizi che vuoi nel caso sia in univ
fi
Psycotic
08-06-2004, 08:46
Oppure una cosa ancora piu' bella!!
Usa i runlevel
Per esempio in universita usi il runlevel 5 che e' quello con tutti i servizi
e a casa usi il runlevel 4 con i servizi che dici tu...
Ci sono apposta i runlevel!!!
beppicus
08-06-2004, 10:12
Originariamente inviato da Psycotic
Oppure una cosa ancora piu' bella!!
Usa i runlevel
Per esempio in universita usi il runlevel 5 che e' quello con tutti i servizi
e a casa usi il runlevel 4 con i servizi che dici tu...
Ci sono apposta i runlevel!!!
Certo, si potrebbe, ma non sarebbe ancora automatico: dovrei comunque far partire init 4 o init 5 a mano dopo l'avvio (o magari anche dal menu di Lilo)
Originariamente inviato da beppicus
Certo, si potrebbe, ma non sarebbe ancora automatico: dovrei comunque far partire init 4 o init 5 a mano dopo l'avvio (o magari anche dal menu di Lilo)
hai provato quanto sopra? funziona?
lnessuno
08-06-2004, 10:15
e usare uno script da far partire a mano?
Originariamente inviato da lnessuno
e usare uno script da far partire a mano?
adesso ti mena :D :D
beppicus
08-06-2004, 11:49
Originariamente inviato da kingv
adesso ti mena :D :D
Ma no...... :cry: :cry: :cry: .... al massimo piango....
La tua soluzione non l'ho provata perchè non l'ho capita benissimo: l'eseguibile dhcpcd (che non si trova in /usr/sbin) ritorna un valore che è vero o falso a seconda che la negoziazione DHCP abbia dato esito positivo o meno?
Se è così potrebbe funzionare, ma il client dhcp viene chiamato forse un po' troppo presto (rc.inet1) e quindi non potrei far partire alcuni servizi, ad esempio quelli grafici, in quanto il server X non è ancora stato lanciato a quel punto del boot..... spero di essermi spiegato....
Psycotic
08-06-2004, 12:38
beh si puo' funzionare perche' e' true se ritorna un return code = 0
Cmq se funziona... nn x forsa gli devi far eseguire subito il servizio...
Puoi fare che dopo l' IF se va bene crei un link sul runlevel che utilizzi.. Semplice no?
Originariamente inviato da beppicus
La tua soluzione non l'ho provata perchè non l'ho capita benissimo: l'eseguibile dhcpcd (che non si trova in /usr/sbin) ritorna un valore che è vero o falso a seconda che la negoziazione DHCP abbia dato esito positivo o meno?
beh sostituisci il path, sono andato a naso :)
sì dovrebbe darti un codice di ritorno differente se riesce a ottenere l'ip o meno.
Se è così potrebbe funzionare, ma il client dhcp viene chiamato forse un po' troppo presto (rc.inet1) e quindi non potrei far partire alcuni servizi, ad esempio quelli grafici, in quanto il server X non è ancora stato lanciato a quel punto del boot..... spero di essermi spiegato....
ok allora dentro inet1 fai il touch di un file e poi dentro rc.local testi l'esistenza e lo cancelli.
ci sono 10000 maniere di farlo ma devi fare qualche prova.
beppicus
08-06-2004, 13:33
Grazie a entrambi, mi sembra che ora qualche idea buona su cui provare c'è...
Appena ho tempo (fuori dagli orari di lavoro :sofico: ) faccio qualche prova e poi vi dico se è andata a buon fine.
Grazie ancora e Ciao.
Originariamente inviato da beppicus
Appena ho tempo (fuori dagli orari di lavoro :sofico: ) faccio qualche prova e poi vi dico se è andata a buon fine.
e' l'orario lavorativo il periodo piu' adatto per certe prove, a casa la sera non si sta sul pc :oink:
:D :D
Psycotic
08-06-2004, 16:08
ha ragione kingv
la sera se nn si e' distrutti..... Si esce con la cuffia e gli Immortal a tutto volume, poi si beve e si sparano cazzate.....
Me la insegnato un monaco buddista....
beppicus
08-06-2004, 16:20
:p
gurutech
08-06-2004, 18:56
scusate ma a me la proposta iniziale di grep + if sembrava perfettamente ragionevole.
si implementa così:
#!/bin/sh
DOMINIO="gurutech.it"
if ( grep -i "$DOMINIO" /etc/resolv.conf 2> /dev/null &> /dev/null); then {
echo "sei collegato"
}
else
{
echo "non sei collegato"
}
fi
(i /dev/null servono a buttare via l'output di grep)
tieni presente che così però non fai un check vero e proprio di collegamento, ma controlli solo se in quel file c'è una determinata riga.
altre proposta:
installa iputils-ping al posto di netkit-ping, così hai l'opzione -w (deadline) con cui imposti i secondi massimi di attesa di risposta e usa
come condizione
ping -w 1 indirizzo_ip_certo | grep -i "64 bytes from" 2> /dev/null &> /dev/null
beppicus
09-06-2004, 08:11
Originariamente inviato da gurutech
scusate ma a me la proposta iniziale di grep + if sembrava perfettamente ragionevole.
si implementa così:
#!/bin/sh
DOMINIO="gurutech.it"
if ( grep -i "$DOMINIO" /etc/resolv.conf 2> /dev/null &> /dev/null); then {
echo "sei collegato"
}
else
{
echo "non sei collegato"
}
fi
(i /dev/null servono a buttare via l'output di grep)
tieni presente che così però non fai un check vero e proprio di collegamento, ma controlli solo se in quel file c'è una determinata riga.
altre proposta:
installa iputils-ping al posto di netkit-ping, così hai l'opzione -w (deadline) con cui imposti i secondi massimi di attesa di risposta e usa
come condizione
ping -w 1 indirizzo_ip_certo | grep -i "64 bytes from" 2> /dev/null &> /dev/null
Grazie, in origine ero partito da questa idea perchè mi sembrava più "Progessional"..... ma non ho ben capito che cosa fanno gli operatori 2> e &> ...... la funzione grep restituisce 2 valori? Uno penso sia la stringa trovata (linea) e l'altro?
Ancora grazie.
gurutech
09-06-2004, 08:36
Originariamente inviato da beppicus
Grazie, in origine ero partito da questa idea perchè mi sembrava più "Progessional"..... ma non ho ben capito che cosa fanno gli operatori 2> e &> ...... la funzione grep restituisce 2 valori? Uno penso sia la stringa trovata (linea) e l'altro?
Ancora grazie.
&> redirezione dello standard output
bash-2.05a$ echo -e "pippo\npluto"
pippo
pluto
bash-2.05a$ echo -e "pippo\npluto" | grep pippo
pippo
bash-2.05a$ echo -e "pippo\npluto" | grep pippo &> /dev/null
2> redirezione dello standard error
bash-2.05a$ grep pippo sldihfedeuicvevouidf.txt
grep: sldihfedeuicvevouidf.txt: No such file or directory
bash-2.05a$ grep pippo sldihfedeuicvevouidf.txt 2> /dev/null
esercizio:
/dev/null è, come il nome promette, il nulla
prova a mettere l'output di errori e comandi dentro dei file di testo
Originariamente inviato da gurutech
&> redirezione dello standard output
e' ridirezione dello stdout e dello stderr contemporaneamente.
con > fai il redirect dell stdout ;)
gurutech
09-06-2004, 08:44
Originariamente inviato da kingv
e' ridirezione dello stdout e dello stderr contemporaneamente.
con > fai il redirect dell stdout ;)
oops hai ragione! piccolo lapsus
beppicus
09-06-2004, 08:51
Tutto Chiaro ;)
Grasssssie
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.