Come eseguire i comandi del terminale Windows, Linux, macOS in Java e restituire il risultato completo
Pubblicato: 2019-02-26 L'esecuzione di un system command
è relativamente semplice, una volta che l'hai visto eseguito la prima volta.
Implica l'uso di due classi Java, la classe Runtime e la classe Process. Fondamentalmente, usi il exec method
della classe Runtime per eseguire il comando come processo separato.
Invocare il metodo exec restituisce un oggetto Process per la gestione del sottoprocesso. Quindi si utilizzano i getInputStream()
e getErrorStream()
dell'oggetto Process
per leggere l'output normale del comando e l'output di errore del comando. Quello che fai con l'output del comando eseguito dipende interamente da te e dall'applicazione che stai creando.
I ProcessBuilder.start()
e Runtime.exec
creano un processo nativo e restituiscono un'istanza di una sottoclasse di Process
che può essere utilizzata per controllare il processo e ottenere informazioni su di esso.
La classe Process
fornisce metodi per eseguire l'input dal processo, eseguire l'output nel processo, attendere il completamento del processo, controllare lo stato di uscita del processo e distruggere (uccidere) il processo.
I metodi che creano processi potrebbero non funzionare bene per processi speciali su alcune piattaforme native, come processi di windowing nativi, processi daemon, processi Win16/DOS su Microsoft Windows o script di shell.
Per impostazione predefinita, il processo secondario creato non dispone di un proprio terminale o console. Tutte le sue operazioni di I/O standard (cioè stdin, stdout, stderr) verranno reindirizzate al processo padre, dove è possibile accedervi tramite i flussi ottenuti utilizzando i metodi getOutputStream()
, getInputStream()
e getErrorStream()
.
Il processo padre usa questi flussi per alimentare l'input e ottenere l'output dal sottoprocesso. Poiché alcune piattaforme native forniscono solo dimensioni limitate del buffer per i flussi di input e output standard, la mancata scrittura tempestiva del flusso di input o la lettura del flusso di output del sottoprocesso può causare il blocco del sottoprocesso o addirittura il deadlock.
Di seguito sono riportati due semplici esempi Java come riferimento.
Esempio 1. Esegui mkdir, ls -ltra e ping in Java
- Crea file CrunchifyCommandJava.java
- Esegui
mkdir /Users/ashah/Desktop/new-folder
- Esegui
ls -ltra /Library
- Esegui
ping crunchify.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
package crunchify . com . tutorials ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . InputStream ; import java . io . InputStreamReader ; /** * @author Crunchify.com * Execute Linux commands using Java. We are executing mkdir, ls -ltra and ping in this tutorial */ public class CrunchifyCommandJava { public printOutput getStreamWrapper ( InputStream is , String type ) { return new printOutput ( is , type ) ; } public static void main ( String [ ] args ) { Runtime rt = Runtime . getRuntime ( ) ; CrunchifyCommandJava rte = new CrunchifyCommandJava ( ) ; printOutput errorReported , outputMessage ; try { Process proc = rt . exec ( "mkdir /Users/ashah/Desktop/new-folder" ) ; errorReported = rte . getStreamWrapper ( proc . getErrorStream ( ) , "ERROR" ) ; outputMessage = rte . getStreamWrapper ( proc . getInputStream ( ) , "OUTPUT" ) ; errorReported . start ( ) ; outputMessage . start ( ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; } try { Process proc = rt . exec ( "ls -ltra /Library" ) ; errorReported = rte . getStreamWrapper ( proc . getErrorStream ( ) , "ERROR" ) ; outputMessage = rte . getStreamWrapper ( proc . getInputStream ( ) , "OUTPUT" ) ; errorReported . start ( ) ; outputMessage . start ( ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; } try { Process proc = rt . exec ( "ping crunchify.com" ) ; errorReported = rte . getStreamWrapper ( proc . getErrorStream ( ) , "ERROR" ) ; outputMessage = rte . getStreamWrapper ( proc . getInputStream ( ) , "OUTPUT" ) ; errorReported . start ( ) ; outputMessage . start ( ) ; } catch ( IOException e ) { e . printStackTrace ( ) ; } } private class printOutput extends Thread { InputStream is = null ; printOutput ( InputStream is , String type ) { this . is = is ; } public void run ( ) { String s = null ; try { BufferedReader br = new BufferedReader ( new InputStreamReader ( is ) ) ; while ( ( s = br . readLine ( ) ) ! = null ) { System . out . println ( s ) ; } } catch ( IOException ioe ) { ioe . printStackTrace ( ) ; } } } } |
Assicurati di modificare il percorso di conseguenza nel programma sopra in base alle impostazioni di sistema.
Uscita console Eclipse:
Basta eseguire il programma sopra come un'applicazione Java e vedrai un risultato simile.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
mkdir: /Users/ashah/Desktop/new-file-created.txt: File created total 0 drwxr-xr-x 3 root wheel 96 Aug 17 2018 Compositions drwxr-xr-x@ 2 root wheel 64 Aug 17 2018 GPUBundles drwxr-xr-x 2 root wheel 64 Aug 17 2018 SystemProfiler drwxr-xr-x 2 root wheel 64 Aug 17 2018 ColorPickers -rw-r--r-- 1 root wheel 0 Aug 17 2018 .localized drwxr-xr-x 2 root wheel 64 Aug 17 2018 StartupItems drwxr-xr-x 3 root wheel 96 Aug 17 2018 Speech drwxr-xr-x 4 root wheel 128 Aug 17 2018 Ruby drwxr-xr-x@ 2 root wheel 64 Aug 17 2018 CoreAnalytics drwxr-xr-x 3 root wheel 96 Aug 17 2018 DirectoryServices drwxr-xr-x 5 root wheel 160 Aug 17 2018 WebServer drwxr-xr-x 3 root wheel 96 Aug 17 2018 Perl drwxr-xr-x 2 root wheel 64 Aug 17 2018 ScriptingAdditions drwxr-xr-x 2 root wheel 64 Aug 17 2018 Keyboard Layouts drwxr-xr-x 3 root wheel 96 Aug 17 2018 Graphics drwxr-xr-x 3 root wheel 96 Aug 17 2018 Python drwxr-xr-x 8 root wheel 256 Oct 11 16:51 User Pictures drwxr-xr-x 3 root wheel 96 Oct 11 16:51 Screen Savers drwxr-xr-x 51 root wheel 1632 Oct 11 16:51 Desktop Pictures drwxr-xr-x 2 root wheel 64 Oct 18 18:51 Contextual Menu Items drwxr-xr-x 2 root wheel 64 Oct 18 18:51 Components drwxr-xr-x 5 root wheel 160 Oct 21 16:03 OpenDirectory drwxr-xr-x 2 root wheel 64 Oct 23 20:43 Input Methods drwxr-xr-x 4 root wheel 128 Oct 29 23:49 Video drwxr-xr-x 3 root wheel 96 Nov 5 21:20 Messages drwxr-xr-x@ 3 root wheel 96 Nov 12 22:37 MessageTracer drwxr-xr-x 3 root wheel 96 Nov 12 22:55 CoreMediaIO drwxr-xr-x 3 root wheel 96 Nov 29 23:38 Sandbox drwxr-xr-x 3 root wheel 96 Nov 29 23:38 Filesystems drwxr-xr-x 8 root wheel 256 Nov 29 23:40 Image Capture drwxr-xr-x 4 root wheel 128 Nov 29 23:41 Java drwxr-xr-x 4 root wheel 128 Nov 29 23:41 QuickTime drwxr-xr-x 10 root wheel 320 Nov 29 23:45 Scripts drwxrwxr-t 182 root admin 5824 Nov 29 23:47 Fonts drwxr-xr-x 4 root wheel 128 Nov 29 23:49 QuickLook drwxr-xr-x 4 root wheel 128 Nov 29 23:49 Spotlight drwxr-xr-x 37 root wheel 1184 Nov 29 23:50 Modem Scripts drwxr-xr-x 4 root wheel 128 Feb 11 13:00 ColorSync drwxr-xr-x 4 root wheel 128 Feb 11 13:04 Security drwxr-xr-x 8 root wheel 256 Feb 11 13:04 PDF Services drwxr-xr-x 3 root wheel 96 Feb 11 13:05 Catacomb drwxr-xr-x 9 root wheel 288 Feb 11 13:05 Frameworks drwxr-xr-x 3 root wheel 96 Feb 11 13:05 Automator drwxr-xr-x 10 root wheel 320 Feb 11 13:05 Audio drwxr-xr-x 3 root wheel 96 Feb 11 13:05 Tanium drwxr-xr-x+ 68 root wheel 2176 Feb 11 13:05 . drwxr-xr-x 3 root admin 96 Feb 11 13:05 Developer drwxr-xr-x 8 root wheel 256 Feb 11 13:05 Documentation drwxr-xr-x 4 root wheel 128 Feb 11 13:05 DropboxHelperTools drwxrwxr-x 14 root admin 448 Feb 11 13:07 Receipts drwxr-xr-x 4 root wheel 128 Feb 11 13:07 SystemMigration drwxr-xr-x@ 4 root wheel 128 Feb 11 13:10 StagedExtensions drwxr-xr-x 14 root wheel 448 Feb 11 18:26 Widgets drwxr-xr-x 13 root wheel 416 Feb 11 18:26 Extensions drwxr-xr-x 29 root wheel 928 Feb 11 18:35 .. drwxr-xr-x 9 root wheel 288 Feb 17 12:38 Logs drwxrwxrwt 11 root admin 352 Feb 22 13:29 Caches drwxr-xr-x 11 root wheel 352 Feb 22 13:36 LaunchAgents drwxr-xr-x 2 root wheel 64 Feb 22 13:36 PreferencePanes drwxr-xr-x 9 root wheel 288 Feb 22 13:36 Internet Plug-Ins drwxr-xr-t 7 root wheel 224 Feb 22 13:36 PrivilegedHelperTools drwxr-xr-x 18 root wheel 576 Feb 22 13:36 LaunchDaemons drwxr-xr-x 25 root admin 800 Feb 22 16:03 Application Support dr-xr-xr-x 9 root wheel 288 Feb 25 10:24 Printers drwxr-xr-x@ 5 root wheel 160 Feb 25 10:24 Updates drwxr-xr-x 10 root wheel 320 Feb 25 14:12 Keychains drwxr-xr-x 25 root wheel 800 Feb 26 08:07 Managed Preferences drwxr-xr-x 67 root wheel 2144 Feb 26 08:07 Preferences PING crunchify.com (35.197.114.216): 56 data bytes 64 bytes from 35.197.114.216: icmp_seq=0 ttl=54 time=70.275 ms 64 bytes from 35.197.114.216: icmp_seq=1 ttl=54 time=73.876 ms 64 bytes from 35.197.114.216: icmp_seq=2 ttl=54 time=68.134 ms 64 bytes from 35.197.114.216: icmp_seq=3 ttl=54 time=75.951 ms 64 bytes from 35.197.114.216: icmp_seq=4 ttl=54 time=70.205 ms |

Esempio-2.
- CrunchifyRunCommand.java
- Esegui il comando
ps -few
per ottenere l'elenco di tutti i processi in esecuzione sul tuo sistema.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package crunchify . com . tutorials ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . InputStreamReader ; /** * @author Crunchify.com * Execute ps -few command in Java to get list of all processes */ public class CrunchifyRunCommand { public static void main ( String [ ] args ) { String s = null ; try { // Process provides control of native processes started by ProcessBuilder.start and Runtime.exec. // getRuntime() returns the runtime object associated with the current Java application. Process p = Runtime . getRuntime ( ) . exec ( "ps -few" ) ; BufferedReader stdInput = new BufferedReader ( new InputStreamReader ( p . getInputStream ( ) ) ) ; BufferedReader stdError = new BufferedReader ( new InputStreamReader ( p . getErrorStream ( ) ) ) ; // read the output from the command System . out . println ( "Here is the standard output of the command:\n" ) ; while ( ( s = stdInput . readLine ( ) ) ! = null ) { System . out . println ( s ) ; } // read any errors from the attempted command System . out . println ( "Here is the standard error of the command (if any):\n" ) ; while ( ( s = stdError . readLine ( ) ) ! = null ) { System . out . println ( s ) ; } System . exit ( 0 ) ; } catch ( IOException e ) { System . out . println ( "exception happened - here's what I know: " ) ; e . printStackTrace ( ) ; System . exit ( - 1 ) ; } } } |
Uscita console Eclipse:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
Here is the standard output of the command : UID PID PPID C STIME TTY TIME CMD 0 1 0 0 Fri09PM ? ? 7 : 14.76 / sbin / launchd 0 44 1 0 Fri09PM ? ? 0 : 09.67 / usr / sbin / syslogd 0 45 1 0 Fri09PM ? ? 0 : 12.95 / usr / libexec / UserEventAgent ( System ) 0 49 1 0 Fri09PM ? ? 0 : 04.41 / System / Library / PrivateFrameworks / Uninstall . framework / Resources / uninstalld 0 50 1 0 Fri09PM ? ? 0 : 26.75 / usr / libexec / kextd 0 51 1 0 Fri09PM ? ? 2 : 00.76 / System / Library / Frameworks / CoreServices . framework / Versions / A / Frameworks / FSEvents . framework / Versions / A / Support / fseventsd 0 53 1 0 Fri09PM ? ? 4 : 16.25 / usr / local / jamf / bin / jamf launchDaemon - enforceRestrictions - monitorNetworkStateChanges 0 54 1 0 Fri09PM ? ? 0 : 01.29 / System / Library / PrivateFrameworks / MediaRemote . framework / Support / mediaremoted 55 57 1 0 Fri09PM ? ? 0 : 01.23 / System / Library / CoreServices / appleeventsd -- server 0 58 1 0 Fri09PM ? ? 4 : 21.14 / usr / sbin / systemstats -- daemon 0 60 1 0 Fri09PM ? ? 0 : 41.10 / usr / libexec / configd 0 61 1 0 Fri09PM ? ? 1 : 03.98 / System / Library / CoreServices / powerd . bundle / powerd 0 62 1 0 Fri09PM ? ? 0 : 00.89 / Library / Application Support / JAMF / Jamf . app / Contents / MacOS / JamfDaemon . app / Contents / MacOS / JamfDaemon 0 65 1 0 Fri09PM ? ? 0 : 43.84 / usr / libexec / logd 0 66 1 0 Fri09PM ? ? 0 : 00.02 / usr / libexec / keybagd - t 15 0 73 1 0 Fri09PM ? ? 3 : 26.45 / System / Library / Frameworks / CoreServices . framework / Frameworks / Metadata . framework / Support / mds 240 74 1 0 Fri09PM ? ? 0 : 00.11 / System / Library / CoreServices / iconservicesd 0 75 1 0 Fri09PM ? ? 0 : 03.39 / usr / libexec / diskarbitrationd 0 79 1 0 Fri09PM ? ? 0 : 00.73 / System / Library / CoreServices / backupd . bundle / Contents / Resources / backupd - helper - launchd 0 80 1 0 Fri09PM ? ? 0 : 03.84 / usr / libexec / coreduetd 0 84 1 0 Fri09PM ? ? 2 : 30.59 / usr / libexec / opendirectoryd 0 85 1 0 Fri09PM ? ? 0 : 17.45 / System / Library / PrivateFrameworks / ApplePushService . framework / apsd 0 86 1 0 Fri09PM ? ? 0 : 00.67 / System / Library / PrivateFrameworks / Noticeboard . framework / Versions / A / Resources / nbstated 0 87 1 0 Fri09PM ? ? 0 : 16.91 / System / Library / CoreServices / launchservicesd 266 88 1 0 Fri09PM ? ? 0 : 06.48 / usr / libexec / timed 0 89 1 0 Fri09PM ? ? 0 : 25.37 / usr / sbin / securityd - i 213 90 1 0 Fri09PM ? ? 0 : 01.16 / System / Library / PrivateFrameworks / MobileDevice . framework / Versions / A / Resources / usbmuxd - launchd 205 92 1 0 Fri09PM ? ? 0 : 59.64 / usr / libexec / locationd 0 94 1 0 Fri09PM ? ? 0 : 00.08 autofsd 244 95 1 0 Fri09PM ? ? 0 : 03.06 / usr / libexec / displaypolicyd - k 1 0 98 1 0 Fri09PM ? ? 0 : 11.56 / usr / libexec / dasd 0 99 1 0 Fri09PM ? ? 0 : 00.71 / System / Library / PrivateFrameworks / Heimdal . framework / Helpers / kdc 0 103 1 0 Fri09PM ? ? 0 : 00.87 / Library / Tanium / TaniumClient / TaniumClient - d 110048994 104 1 0 Fri09PM ? ? 0 : 34.02 / System / Library / CoreServices / loginwindow . app / Contents / MacOS / loginwindow console 0 105 1 0 Fri09PM ? ? 0 : 00.76 / System / Library / CoreServices / logind 0 106 1 0 Fri09PM ? ? 0 : 00.66 / System / Library / PrivateFrameworks / GenerationalStorage . framework / Versions / A / Support / revisiond 0 107 1 0 Fri09PM ? ? 0 : 00.03 / usr / sbin / KernelEventAgent 0 109 1 0 Fri09PM ? ? 1 : 58.55 / usr / sbin / bluetoothd 261 110 1 0 Fri09PM ? ? 13 : 48.55 / usr / libexec / hidd 0 112 1 0 Fri09PM ? ? 0 : 06.37 / usr / libexec / corebrightnessd -- launchd 0 113 1 0 Fri09PM ? ? 0 : 04.23 / usr / libexec / AirPlayXPCHelper 0 114 1 0 Fri09PM ? ? 1 : 07.01 / usr / sbin / notifyd 241 116 1 0 Fri09PM ? ? 0 : 11.70 / usr / sbin / distnoted daemon 0 119 1 0 Fri09PM ? ? 0 : 03.99 / usr / libexec / amfid 0 123 1 0 Fri09PM ? ? 0 : 09.47 / usr / libexec / syspolicyd 0 124 1 0 Fri09PM ? ? 0 : 05.81 / System / Library / Frameworks / Security . framework / Versions / A / XPCServices / authd . xpc / Contents / MacOS / authd 0 142 1 0 Fri09PM ? ? 1 : 31.63 / usr / sbin / cfprefsd daemon 0 143 1 0 Fri09PM ? ? 0 : 23.54 / System / Library / CoreServices / coreservicesd 0 166 1 0 Fri09PM ? ? 0 : 21.34 / System / Library / PrivateFrameworks / CoreDuetContext . framework / Resources / contextstored |
Questi sono alcuni dei processi in esecuzione sul mio MacBook Pro. Ce ne sono molti in più ma incollati molto pochi.
Spero che questo tutorial ti aiuti a eseguire qualsiasi comando del terminale Linux, macOS usando un semplice programma Java. Fammi sapere per qualsiasi domanda.