Newsgroup: it.comp.java
Titolo: Java e console Linux

Volevo sapere come si fa ad interagire con la console di Linux. Per inviare 
i comandi + o - ho capito ma nn so come intercettare ed elaborare i 
"messaggi" scritti (tipo quelli di errore). Se tipo eseguo un comando su e 
inserisco la passwd (tutto da Java) come faccio a sapere s tutto è andato a 
buon fine?    Grazie 

 writes:
D> Volevo sapere come si fa ad interagire con la console di Linux.
Quale delle 8 usualmenrte presenti :)
D> elaborare i "messaggi" scritti (tipo quelli di errore). Se tipo
D> eseguo un comando su e inserisco la passwd (tutto da Java) come
D> faccio a sapere s tutto è andato a buon fine?  
Guardare per caso la documentazione della classe Process ?
Fare "man bash" da una shell di Linux ?
Comunque  non  mi  pare  che  su  prelevi la  password  da  stdin,  va
direttamente sulla  tty di  controllo, anzi se  provi a  lanciarlo con
stdin rediretto ti becchi:
su: must be run from a terminal
Se la vostra  architettura prevede che Java lanci un su  mi sa che c'è
da ripensarla ma  per bene... Magari dopo essersi  letti per bene "man
chmod" o, probabilmente meglio, "info coreutils chmod".
Ah, per sapere se un  programma è terminato correttamente di solito si
va a controllare  l'exit status, 0 andato tutto  bene, diverso da zero
codice di errore.
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

Davide ha scritto:

Non è affatto chiaro quello che stai facendo e come. Com'è che esegui
(o tenti di eseguire) il comando "su"? Se usi Runtime.exec(), devi
anche sapere che (eventualmente) crei un nuovo processo e non
interagisci con la console corrente. L'effetto non è certo quello di
modificare l'utente del programma java...

> faccio a sapere s tutto č andato a buon fine?  Grazie
VV> Non č affatto chiaro quello che stai facendo e come. Com'č che
VV> esegui (o tenti di eseguire) il comando "su"? Se usi
Tenta,  non mi  sono messo  a scrivere  il codice  Java, ma  se  su si
accorge che a stdin non č collegata una tty si lagna e termina.
VV> nuovo processo e non interagisci con la console
VV> corrente.
Ni. stdin, stdout  e stderr vengono "presi in pipe" da  Java, ma se il
processo (sotto Linux,  ma penso anche sotto un  generico Unix) rimane
legato  alla  tty di  controllo  del  processo  Java e  puň  accedervi
attreverso /dev/tty -tty di controllo-.
Rimane  sacrosanto quello che  hai detto  sul fatto  che in  ogni caso
viene cambiato  lo uid del processo  creato e non  quello del processo
della  JVM (sotto  Linux si  vedono piů  processi perchč  ps  mostra i
thread come processi).
(Notale console sono solo quelle a caratteri che ci sono se non fai
 partire X11, il resto sono tutti terminali)


 della  JVM (sotto  Linux si  vedono più  processi perchè  ps  mostra i


 Devo riuscire a sapere se il comando ping da esito positivo o negativo...
Se puoi evitare di passare per la shell e' molto meglio.
Nel jdk 1.5 esistono nuovi metodi dedicati proprio al "ping"
nella classe java.net.InetAddres:
[...]
public boolean isReachable(int timeout) throws IOException
     Test whether that address is reachable. Best effort is made by the 
implementation to try to reach the host, but firewalls and server configuration 
may block requests resulting in a unreachable status while some specific ports 
may be accessible. A typical implementation will use ICMP ECHO REQUESTs if the 
privilege can be obtained, otherwise it will try to establish a TCP connection 
on port 7 (Echo) of the destination host.
     The timeout value, in milliseconds, indicates the maximum amount of time 
the try should take. If the operation times out before getting an answer, the 
host is deemed unreachable. A negative value will result in an 
IllegalArgumentException being thrown.
     Parameters:
         timeout - the time, in milliseconds, before the call aborts
     Returns:
         a boolean indicating if the address is reachable.
     Throws:
         IOException - if a network error occurs
         IllegalArgumentException - if timeout is negative.
     Since:
         1.5
[...]
C'e' anche questo, con il quale puoi impostare l'interfaccia attraverso
la quale fare il test ed il Time To Live dei pacchetti inviati:
[...]
public boolean isReachable(NetworkInterface netif,
                            int ttl,
                            int timeout) throws IOException
[...]
Ciao!
Roberto

 writes:
D> Certo che non posso eseguire un comando su da Java era solo per
D> fare un esempio...
Beh, era meglio un grep come esempio :)
D> Cmq il mio problema è questo (mi hanno detto che
D> è possibile ma non so come): devo eseguire da Linux un ping sui PC
D> di una rete (di cui conosco l'IP).  Devo riuscire a sapere se il
D> comando ping da esito positivo o negativo...
Se non  puoi usare la  versione 1.5 che,  come ti hanno già  detto, ha
metodi  per  mandare ICMP  ECHO  REQUEST  nella  classe InetAddress  o
cercare di contattare la porta echom puoi testare l'exit value di ping
che è uguale a 0 se tutto è andato bene, diverso da zero altrimenti.
man ping per vedere quali opzioni ti servono.


 Devo riuscire a sapere se il comando ping da esito positivo o negativo...
In generale: tramite un esecuzione di shell puoi catturare l'exit code
del programma, se il programma ritorna qualcosa di significativo bene,
altrimenti è inutile perderci tempo. Francamente non so quale sia il
comportamento di ping, ma se sei curioso potresti fare un piccolo
script e stampare l'exit code.
Ma a parte questo, ti interessa *veramente* fare un ping ICMP? Oppure
il tuo scopo è verificare la risposta generica di un indirizzo IP?
Perchè in Java AFAIK non è possibile creare socket di tipo SOCK_RAW
quindi non si possono mandare pacchetti ICMP, però il problema
potresti risolverlo in decine di modi diversi senza dover appoggiarti a
meccanismi sporchi come chiamate a programmi esterni.

 writes:
VV> Francamente non so quale sia il comportamento di ping, ma
VV> se sei curioso potresti fare un piccolo script e stampare l'exit
VV> code.
Fatto già io :), mi serviva. ping, come ogni altro buon comando Unix
torna 0 se tutto va bene, diverso da zero altrimenti.
VV> Ma a parte questo, ti interessa *veramente* fare un ping ICMP?
VV> Oppure il tuo scopo è verificare la risposta generica di un
VV> indirizzo IP?  Perchè in Java AFAIK non è possibile creare socket
VV> di tipo SOCK_RAW quindi non si possono mandare pacchetti ICMP,
VV> però il problema potresti risolverlo in decine di modi diversi
VV> senza dover appoggiarti a meccanismi sporchi come chiamate a
VV> programmi esterni.
Non è "sporco", è una carenza di Java così come viene consegnato, e la
soluzione  che   hanno  messo  in   piedi  nella  1.5  non   la  trovo
particolarmente elegante.
E  non  è  nemmeno  "sporco"  appoggiarsi  a  programmi  esterni.   E'
potenzialmente (anzi  quasi sicuramente) poco portabile  e non piacerà
al  marketing Sun  del Puro  Java,  ma non  è affatto  sporco, anzi  è
"sveglio", un tipo di "furbizia" che l'uso di certi S.O. fa perdere, e
non  lo dico  per  "razzismo", ma  perché  vedo come  lavorano i  miei
colleghi che li usano (e che sono tutt'altro che persone tonte).
Disse il maestro Foo : "C'è più spirito Unix in una riga sola di shell
che in 10000 righe di C" (Master Foo and The Ten Thousand Lines)
Peraltro ping (ovvero  l'invio un pacchetto ICMP ECHO  REQUEST come un
impulso sonar) è il  metodo storico per verificare la raggiungibilità,
purtroppo non ho  più disponibile la manpage che  lo citava come mezzo
diagnostico post attacco nucleare sovietico :) :) :) :).
Ma questo era nell'età dell'oro... :(.


 colleghi che li usano (e che sono tutt'altro che persone tonte).
Li usano programmando in Java?

> tonte).
VV> Li usano programmando in Java?
Se ti riferisci ai S.O. si, li usano anche per programmare in Java.
Anzi, usano  solo quel genere  di S.O. e  fanno una fatica  barbina (a
volte) dove io lascio lavorare la macchina.


 E bisogna vedere se Java è  la soluzione giusta.
Se Java non è la soluzione giusta il problema sta da un'altra parte.

> E bisogna vedere se Java è la soluzione giusta.
VV> Se Java non è la soluzione giusta il problema sta da un'altra
VV> parte.
Java può non essre la soluzione  giusta per una marea di motivi. E' un
buon linguaggio,  decisamente elegante nella definizione  (un po' meno
in certe librerie) ma non è una religione(*).
Condivido le idee su Java (e sul C++) di Steve Yegge in 
http://www.cabochon.com/~stevey/blog-rants/tour-de-babel.html
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione
(*) c'è un solo programma per cui esiste una chiesa, ed esiste
    ovviamente per ridere...

 meccanismi sporchi come chiamate a programmi esterni.
A prescindere dai discorsi filosofici che ho visto nel thread
(interessantissimi, per carità), con Java5 si 
può fare InetAddress.isReachable(), che è tipicamente implementato proprio
con ICMP echo requests.
uL
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 writes:
u> A prescindere dai discorsi filosofici che ho visto nel thread
u> (interessantissimi, per carità), con Java5 si può fare
u> InetAddress.isReachable(), che è tipicamente implementato proprio
u> con ICMP echo requests.
Ma non è una bella implementazione. 
Non  sarebbe male avere  la possibilità  di generare  tutti i  tipi di
pacchetti ICMP da  una parte e di scegliere  quale strategia usare per
testare se la raggiungibilità dell'host  remoto. Le scelte di Sun sono
buone ma non ottime, poter  usare altre strategie in modo "comodo" non
sarebbe male. E poi non è detto che si abbia 1.5 a disposizione...


 sarebbe male. E poi non è detto che si abbia 1.5 a disposizione...
Si, ci sono dei potenziali problemi nell'usare isReachable (Windows di
default fa tcp 7, ci vogliono permessi di root su unix, ecc.), ma visto
che non ha  specificato cosa deve fare, potrebbe bastare.


 writes:
u> ... ci vogliono permessi di root su unix
Infatti, dimenticavo che ping è setuid :).
Ottimo,   una   tecnica  veramente   molto   pratica  sotto   Unix/GNU
Linux. Veramente utile.
Tanto vale  riscriversi a  mano un tentativo  di connessione  verso la
porta che effettivamente si userà...
