Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [Java] Esecuzione comandi composti

    avrei un problema con di comandi composti:
    codice:
       public static ArrayList<String> schede() throws IOException {
            ArrayList<String> list = new ArrayList<String>();
            Process p = Runtime.getRuntime().exec("ifconfig -a | grep -Eo \"^[a-z]+[0-9]*\"");
            InputStream input = p.getInputStream();
            InputStreamReader reader = new InputStreamReader(input);
            BufferedReader br = new BufferedReader(reader);
            String line;
            while ((line = br.readLine()) != null) {
                list.add(line);
            }
            br.close();
            reader.close();
            input.close();
            return list;
        }
    in pratica, se metto solo ifconfig -a funziona.
    sennò no.
    come se nn riuscisse a gestire il passaggio output-input tramite pipe.
    ho anche provato ad usare un'array di comandi, ma nulla.
    è possibile eseguire comandi composti in java??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Sinceramente non ho mai provato, ma credo tu debba eseguire una shell a cui far eseguire successivamente i comandi.

    Il pipe non è un "comando", ma è una funzione messa a disposizione dalla shell dei comandi. Quando la shell incontra il carattere di pipe, effettua una fork e nel processo figlio esegue una funzione di sistema "pipe" che consente di agganciare il canale di output del primo processo con il canale di input del secondo (detto molto in soldoni).

    Quando, invece, esegui da Java un Runtime.exec(), quello che il sistema operativo fa è di eseguire il processo passato dalla exec() e di agganciare i suoi input e output stream a quelli del processo chiamante (la JVM, che di fatto può leggere e scrivere dal/verso il processo, usanto getInputStream() e getOutputStream() dell'oggetto Process).

    Quindi, se vuoi ottenere l'esecuzione di un pipe di comandi, dovrai far fare il lavoro di aggancio in pipe ad un processo che sia in grado di farlo... e questo processo è una shell.

    In pratica, dovresti provare ad eseguire questo (ripeto, non l'ho mai provato):

    codice:
    Process p = Runtime.getRuntime()
                    .exec("/bin/bash -c \"ifconfig -a | grep -Eo \"^[a-z]+[0-9]*\"\"");
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    ciao!

    purtroppo avevo provato una cosa del genere ma nn ha funzionato.
    cmq tipo posto l'esempio completo:
    codice:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    
    public class Prova {
    
        public static void main(String[] args) throws IOException {
            ArrayList<String> list = new ArrayList<String>();
            Process p = Runtime.getRuntime().exec("/bin/bash -c \"ifconfig -a | grep -Eo \"^[a-z]+[0-9]*\"\"");
            InputStream input = p.getInputStream();
            InputStreamReader reader = new InputStreamReader(input);
            BufferedReader br = new BufferedReader(reader);
            String line;
            while ((line = br.readLine()) != null) {
                list.add(line);
            }
            System.out.println(list);
        }
    }
    in pratica list rimane vuoto.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.