Ciao a tutti.
Sto cercando di buttare giù un script che coinvolge wvdial. Non vi sto a spiegare tutto perché verrebbe un po’ troppo lunga.
Chi usa wvdial, saprà che appena lo si lancia per connettersi, compare a video tutta la serie di comandi modem del tipo:
--> WvDial: Internet dialer version 1.54.0
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: AT+cgdcont=1,"IP","ibox.tim.it",,0,0
AT+cgdcont=1,"IP","ibox.tim.it",,0,0
OK
--> Modem initialized.
--> Sending: ATDT*99***1#
--> Waiting for carrier.
ATDT*99***1#
CONNECT
~[7f]}#@!}!} } }2}#}$@#}!}$}%\}"}&} }*} } g}%~
--> Carrier detected. Waiting for prompt.
~[7f]}#@!}!} } }2}#}$@#}!}$}%\}"}&} }*} } g}%~
--> PPP negotiation detected.
--> Starting pppd at Sat May 5 10:13:21 2007
--> pid of pppd: 3453
--> Using interface ppp0
--> pppd: t2
--> pppd: t2
--> pppd: t2
--> local IP address *********
--> pppd: t2
--> remote IP address 10.6.6.6
--> pppd: t2
--> primary DNS address 213.230.130.222
--> pppd: t2
--> secondary DNS address 213.230.155.94
--> pppd: t2
Bene, nello script che sto scrivendo ho la necessità di ottenere su un file di testo questo output.
La prima cosa che mi è venuta in mente è stata la semplice redirezione output su file:
wvdial > log.wvdial
Purtroppo non funge. Infatti il terminale si riempie come al solito, mentre il file log.wvdial viene sì creato, ma resta vuoto.
Come potrei fare?
Sto cercando su google da un po’, ma non sono ancora riuscito a trovare nulla, allora ho pensato: “metto un post e continuo la ricerca, se qualcuno ha la risposta sotto mano, risparmierò tempo…”.
Spero in una vostra risposta, ringraziandovi in anticipo.
Prova a reindirizzare anche lo standard error sul file:
wvdial 2> log.wvdial
oppure ancora meglio:
wvdial > log.wvdial 2>&1
Con quest’ultimo comando indirizzi lo standard output sul file di log e lo standard error (2>) sullo standard output (e di conseguenza ancora nel file di log)
E’ vero!!!.. che sciocco, non avevo pensato allo std error.
Chiedo perdono, anche se magari chi leggerà questa discussione e avesse il mio stesso dubbio, potrà trarne benefici.
Grazie infinite come sempre zod!!!
@ palir1927
Ti ringrazio per l’intervento, ma francamente, mi sfugge il significato della tua soluzione:
wvdial è un comando, more è un altro comando… che senso avrebbe “more wvdial” o “more VARIABILE” (anzi forse sarebbe meglio "more $VARIABILE)
La bash logicamente mi risponde “wvdila no such file or directory”…
Forse intendevi:
wvdial |more
ma questo redirige lo stdoutput che è praticamente vuoto.
A questo punto invece è chiaro che a dovere essere rediretto è lo stderror, non lo stdoutput.
Ok. comunque Fine Risolto, Grazie Mille.
Posterò altri messaggi sempre dentro questa discussione. Ma per rendere tutto un po’ più pulito vi porporrò un secondo problemino forse un po’ meno banale, in un post successivo.
Rieccomi, ho pensato di mettere in chiaro il problema subito, intanto nel frattempo cerco, così accorciamo i tempi.
Il secondo problema che devo affrontare nello script è l’utilizzo stesso di wvdial.
Mi spiego:
wvdial ha bisogno dei permessi di root.
se lo utilizzo in uno script devo usarlo almeno col “sudo” affinchè funzioni…
oppure dare “sudo script.sh”.
Vi chiederete dove sta il problema, immagino…
Il fatto è che questo beato script deve girare autonomamente senza la presenza di un utente (io) davanti allo schermo, quindi non posso inserire password, di conseguenza non so come fare a utilizzare wvdial.
In pratica dovrò utilizzarlo (lo script) come “operazione pianificata” (non ho mai usato crontab, ma ne conosco l’esistenza.) in modo che venga richiamato ogni 10 minuti circa.
Spero abbiate idea di come posso scavalcare l’introduzione di password in modo che lo script funzioni da solo. Grazie in anticipo.
Non uso wvdial, ma mi sembra di ricordare che nel file /etc/wvdial.conf sia possibile inserire la password da utilizzare. Se così non fosse esistono una coppia di comandi che permettono di “registrare” per poi “riprodurre” quanto avviene in un terminale: in tal modo potresti creare una sorta di macro che inserisce automaticamente la password quando avviene la richiesta da parte di wvdial. La brutta notizia è che mi sfuggono i nomi di tali comandi e non ho modo di cercarli in questi giorni, però se non erro il nome di uno dei due inizia con “auto”! Con un po’ di fortuna se scrivi “auto” e premi due volte dovresti riuscire a trovare i comandi di cui parlo! Credo che ci sia anche un mio post qui da qualche parte in cui cito appunto quella coppia di comandi, ma non riesco a ritrovarlo! :lol:
capisco zod, ma forse c’è un equivoco.
Mi pare di capire che tu stia parlando di password per la connessione all’isp…io non ho quel problema, quando mi connetto non mi servono password e nome utente.
No, io mi riferivo alla password di root, necessaria perché wvdial non si connette se non viene lanciato da root.
Quindi per far funzionare wbdial a mano si hanno due alternative:
1-
$ su
password
# wvdial
2-
$ sudo wvdial
password
In ogni caso bisogna comunque inserire una password.
Premesso che non ho ancora trovato nulla di troppo attinente, azzardo ad affermare che forse il problema non sussiste.
Vi riporto la seguente affermazione estratta da un sito:
“Crond viene eseguito come root e può impersonificare qualsiasi utente”.
se così fosse sarei apposto.
Per provare ora vorrei fare uno script inutile a fini pratici, ma significativo per provare la fattibilità dell’operazione (cioè far partire uno script in cronotab che coinvolga comandi utilizzabili solo da root).
A tal fine vi propongo il seguente script che banalmente connette ad internet, asppetta 5 secondi e disconnette:
#!/bin/bash
wvdial
sleep 5
killall wvdial
ok, ora vorrei aggiungerlo a crontab in modo da avviarlo sistematicamente ogni 2 minuti.
Sinceramente devo un po’ documentarmi su crontab e crond…faccio un salto agli appunti d’informatica libera passando per google e vi faccio sapere se funge.
Se così fosse direi di aver risolto il problema…
Se poi comunque voleste aggiungere qualcosa, non esitate!!!
Ah scusami, avevo capito male…
Allora non c’è problema, è come dici tu, puoi eseguire “wvdial” nel cron dell’utente root e risolvi il problema.
Ti consiglio di dare un’occhiata al comando “crontab” per la sintassi e all’opzione “-e” per editare/creare un file di cron.
Per quanto riguarda “sudo”, sappi che puoi fare in modo che la password non venga chiesta nemmeno all’utente “normale”, utilizzando “NOPASSWD” all’interno del file /etc/sudoers (se modifichi questo file fai molta attenzione alla sua sintassi : la cosa migliore è utilizzare l’editor “visudo”, simile a “vi”, che ne controlla la sintassi prima di effettuare il salvataggio)
Non ti preoccupare, è abbastanza semplice da utilizzare, sono sicuro che ci riuscirai a fare quello che desideri in poco tempo!
Ciao!
Sì ho visto, non sembra difficile, ma per ora non sono riuscito a farlo funzionare.
Ma non potrei editare un crontab dell’utente semplice e mettere la stringa in modo tale che risulti root l’utente che esegue lo script?
Purtroppo così non mi funge…
Ma ammetto di aver fatto tutto unpo’ troppo di corsa…
Dovrei leggere meglio la documentazione.
Grazie mille anche per le dritte sul sudo. Ma se non dovessi
utilizzare più la pasword allora tanto vale loggarsi come root (probabilmente l’ho detta grossa…!!!), va bè
[quote=zod]
La brutta notizia è che mi sfuggono i nomi di tali comandi e non ho modo di cercarli in questi giorni[/quote]
Giusto per completezza, visto che mi sono ricordato i nomi dei comandi, segnalo che mi riferivo a expect e autoexpect, anche se nel tuo caso non c’entrano nulla perché avevo frainteso il problema, ma magari possono servirti in futuro in altre circostanze.
E’ corretto, però lo devi pianificare per l’utente root e non per il tuo utente. Quindi:
Lo script che dicevo gira tranquillamente ogni 5 minut o giù di lì.
Quindi, problema risolto.
Avevo provato a farlo girare anche ogni minuto inserendo in crontab:
* * * * * /percorso/script.sh
Purtroppo però così non funziona, ma è unproblema dello script:
infatti in questo sono presenti dei controlli che per forza di cose necessitano di sleep abbastanza lunghi e coinvolgono wvdial.
Ora, il problema è che lo script impiega anche più di un minuto e probabilmente si va a sovrapporre al lancio dello stesso script del minuto successivo.
Alla fine, in pratica ho due processi che richiamano wvdial e se lo richiamano contemporaneamente o quasi, ad uno dei due il modem risulta occuppato.
E non se ne viene fuori. cioè, semplicemente occorre dare un passo più ampio all’esecuzione dello script.
Per e sempio 6 minuti è una buona scelta…
Quindi in crontab ho inserito una stringa di questo tipo:
00-59/6 * * * * /percorso/script.sh
Colgo l’occasione per ringraziarvi e spero il prima possibile di riuscire a contribuire con qualche dritta: ho visto una discussione un po’ datata, ma aggiornabile con una risposta che stranamente ho a portata di mano.
A presto.
Io non so che cosa devi fare esattamente, però da quel che dici potrebbe essere sufficiente un semplice controllo all’interno dello script “se il processo wvdial è in esecuzione esci dallo script senza fare nulla”.
Qualcosa tipo:
#!/bin/bash
pgrep wvdial
if $? -eq 0 ] # wvdial è gia' in esecuzione
then
exit 1
fi
bla bla bla
altrimenti fai quello che devi fare
bla bla bla
Poi però, ripeto, non so esattamente a cosa ti serva quello script nel cron e non so se il controllo che ti ho suggerito possa fare al caso tuo o meno, pero’ magari ti può essere comunque da spunto per qualche altra idea!
Avevo pensato anch’io a qualcosa di simile, ma non va bene…
Spiego brevemente, a titolo “informativo” cercando di essere sintetico.
Come ho già accennato in altri post, ho una connessione dal cellulare: nokia 6230 da rete tim in tecnologia edge.
Spesso (specie la sera), mentre sono connesso, capita che, nonostante la connessione sia up, non si riesca a scambiare alcun dato.
Non so spiegare perché accada (e sarei molto curioso di capire dove sta il problema…), ma il fatto è che la connessione resta in questo “limbo” in eterno.
Se fosse un problema di linea che cade, allora la tua proposta sarebbe praticabile, ma purtroppo la storia è un po’ più complicata.
Non solo, ma non basta neanche disconnettersi e riconnettersi, infatti anche dopo la disconnessione iltelefono risulta bloccato e non riesce a riallacciarsi.
E’ da un po’ che sono “costretto” a sta connessione e col tempo ho imparato un trucchetto da quattro soldi, ma efficace.
Chiaramente basterebbe spegnere e riaccendere il telefono e riconnettersi…
Ma a meno di non frapporre tra batteria e telefono un chip fatto in casa (non sono proprio all’altezza) e gestirlo con qualche programma, tale soluzione deve essere fatta manualmente.
Il trucchetto (più elegante) che dicevo sopra può essere così riassunto:
1- disconnessione (il telefono è però ancora bloccato)
2- chiamare un numero di telefono (io ho tim e faccio il 4916): lo faccio con wvdial qui in fedora, ma anche su windows si può fare con rasdial.
2.a se il telefono era ancora bloccato la chiamata termina subito con un segnale acustico del 6230 e wvdial manda in stderror un messaggio contenente la stringa “NO CARRIER”.
2.b ripetendo alcune volte il punto “2.a”, dopo un po’ il telefono si “sblocca” emettendo un altro segnale acustico diverso dai precedenti.
pensate di potervi riconnettere?..eh no, non funziona ancora.
2.c dopo che il telefono ha emesso il segnale sonoro che ne indica lo sblocco, bisogna chiamare ancora una volta il 4916 e sta volta non emettera nessun segnale sonoro, ma raggiungerà il timeout impostato da wvdial e il messaggio dello std error non comprende più la stringa “NO CARRIER”, ma qualcos’altro che al momento non ricordo.
(nota: chiamando il 4916 con wvdial non ci risponde nessuno: non si riesce, e non ci serve, effettuare la chiamata in modo completo)
3- ora il telefono è completamente funzionante e la riconnessione al numero del provider (99**1#) funziona regolarmente.
Io non ho fatto altro che fare uno script che verifica se un sito è “pingabile” e a seconda dell’output di ping effettua la procedura di sblocco e quindi riconnette.
Come si vede, occorre far girare wvdial, per sbloccarlo, ma wvdial gira anche quando la connessione è up.
pertanto non posso usare il metodo da te consigliato usando come “processo discriminante” wvdial.
A ben vedere però si potrebbe fare un gioco di “scatole cinesi” (che attualmente vanno molto di moda “li mortacci loro”] ), adottando come “processo discriminante” lo stesso script di sblocco.
Del tipo:
uno script padre in cui richiamo lo script di cui ho parlato sopra:
----script.padre----
if è in esecuzione lo script di sblocco
non fare nulla
else
lancia lo script di sblocco
fi
--------------------
quindi far girare script.padre in crontab ogni minuto.
Forse così potrei farlo girare più spesso scongiurando, allo stesso tempo, sovrapposizioni di processi.
Grazie per la dritta. e se ne hai altre fatti pure sentire.
Se poi sapeste il motivo di questo fastidioso comportamento delle connessioni edge/gprs, magari avendo anche in tasca la soluzione “alla radice” del problema, allora fatevi avanti al più presto!!!
Ah ok, avevo già letto quel tuo problema ma non avevo capito che le due cose erano collegate. Non ho proprio idea da cosa possa dipendere, pero’ azzardo una cosa (ma prendila con le pinze): sei sicuro che il numero da comporre sia “99**1#”? Mi pare che con i Nokia basti “*99#” e venga preselezionata l’apn configurata per default sul cellulare… Però mi potrei benissimo sbagliare e in ogni caso non è detto che il tuo problema dipenda da questo… Magari è il cellulare che ha problemi o magari semplicemente nella tua zona c’è qualcosa che non funziona come dovrebbe a livello di centrali/ripetitori gprs. Non so proprio che dirti…
Puoi usare una sorta di file di lock. Quando lo script viene avviato controlla la presenza di un determinato file di lock, se c’è esce senza fare nulla, altrimenti lo crea, fa quello che deve fare e lo elimina in chiusura…
Caro zod, anzitutto grazie per la disponibilità e complimenti
per la competenza: ne sai una più del diavo eh…
Mi piace l’idea del file di lock, io sono un principiante
di scripting (e non solo) e questo espediente non m’era
venuto in mente, mi sembra valido… lo proverò senz’altro.
Per il mio cell il numero che chiamo funziona, quindi dovrebbe
essere giusto, inoltre (anche se non c’è da fidarsi troppo),
la tim suggerisce proprio quello per il mio modello (almeno
quando avevo configurato la connessione per la prima volta…).
Mi pare strano che dipenda da quello però.
Comunque tentar non nuoce, proverò a fare una prova col numero
che hai riportato. Nel telefono l’apn è ibox.tim.it di suo, e così
deve essere…anzi se fosse differente le offerte repagate non
hanno validità e si pgherebbe veramente uno sproposito.
La mia zona?
potrebbe essere, ma mi è capitato anche altrove…
Il telefono…non saprei. però capita anche ad altri amici
che si muovono in rete con un cellulare diverso…booo
Chissa che non abbiano dei problemi di sovrattraffico nella cella
in determinati momenti della giornata…chissà
Sì, anche secondo me non dipende da quello, te l’ho buttata lì giusto perché so che sia con il mio 6680 che con il 6070 (e in precedenza con il 6310) mi collego con quella stringa con qualsiasi operatore, mentre con i Motorola era necessario aggiungere “****1#” o qualosa del genere! Però non so più di tanto al riguardo e se hai seguito le istruzioni che ti ha dato l’operatore mobile dubito ancora di più che il problema derivi dalla stringa…
[quote]
Chissa che non abbiano dei problemi di sovrattraffico nella cella
in determinati momenti della giornata…chissà[/quote]
Tutto può essere…
Se comunque risolvi fammi sapere perché 'sta cosa mi incuriosisce!
Ciao
Questa notte ho lasciato il neo installato azureus a scaricare una iso.
Purtroppo sta mattina l’ho ritrovato ancora dov’era ieri sera ed il telefono stava richiamando in continuazione il 4916…
Eppure ieri sera l’avevo provato e pareva fare il suo dovere…ma gli script si sà, vanno rodati un po’ (soprattutto i miei… ).
L’inghippo sta in una funzione che comprende un ciclo “until” dove si ripete la chiamata al 4916, ve la posto:
sblocca() # esegue una serie di operazione per sbloccare il modem dopo aver disconnesso:
{
killall wvdial
sleep 5
sbloccato=0
until $sbloccato = 1 ]; do
wvdial 4916 > sblock.log 2>&1 &
sleep 5
cat sblock.log |bool ' "NO CARRIER" or "Cannot open /dev/modem: Device or resource busy" '
if $? -eq 1 ]; then
sbloccato=1
fi
killall wvdial
sleep 10
done
sleep 5
wvdial 4916 > sblock.log 2>&1 &
sleep 5
killall wvdial
sleep 5
}
Per il resto se avrò notizie di come risolvere il problema alla radice o eventualmente da cosa dipenda, farò sapere senz’altro. A presto!!!
Sei sicuro di questo comando? Magari dico una (l’ennesima) boiata (!!!), ma “bool” mi sa più di C che di bash… O forse hai installato qualche pacchetto che contiene un comando “bool”?
Se è questo il problema si dovrebbe risolvere con:
grep "NO CARRIER\|Cannot open /dev/modem: Device or resource busy" sblock.log
o qualcosa di simile
(grep restituirebbe 0 nel caso trovasse una delle due stringhe)
Facendo una prova veloce infatti “bool” nel mio caso riporta l’errore “command not found” ed esce con codice di errore “127”, quindi il controllo 127 -eq 1 ] risulta sempre falso.
Tieni presente che puoi fare un po’ di debug al tuo script eseguendolo con il comando: