2009-06-18 13 views
13

Provare a scrivere un programma Java in grado di eseguire un comando UNIX come un utente UNIX diverso. Ho la password dell'utente e conosco il comando che voglio eseguire, ma il comando deve essere eseguito come tale utente, quindi devo prima effettuare il login come utente.Esecuzione di comandi UNIX come utente diverso, da Java

Ad esempio: diciamo che abbiamo un utente, jim, che vuole vedere cosa c'è nella home directory di bob e (per qualsiasi motivo) jim ha accesso per eseguire ls mentre bob no. Attualmente siamo registrati come bob. Ecco cosa (potremmo) fare:

Il problema è che viene richiesta la password di jim. Dal momento che questo è gestito da un programma Java, vale a dire

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

veniamo richiesta la password di Jim e riattaccò. Sappiamo la password di jim. Tuttavia, non posso inserirlo.

Inoltre, non è possibile utilizzare uno script Expect (non installarlo) e non è possibile diventare superutente. Ho anche guardato in usando SSH di provare questo, dato che abbiamo potuto tecnicamente fare

[email protected]$ ssh [email protected] "ls ~bob" 

ma anche questo non funziona dal momento che non ho il permesso di messa a punto senza password SSH.

Il mio ultimo tentativo è di provare e utilizzare una libreria SSH per Java, dal momento che la password è disponibile per il programma Java e sarei in grado di accedere con quello (ed eseguire il comando corretto). Ma dal momento che sto per essere in esecuzione sullo stesso host, sembra eccessivo.

Qualche suggerimento?

P.S: versione 1.4.2 di Java, non è possibile eseguire l'aggiornamento; AIX UNIX 5.3.

+0

Sei riuscito a trovare una soluzione alternativa senza utilizzare una libreria di terze parti, in caso affermativo puoi condividere? – HyperioN

risposta

6

Problema risolto. Usato JSch (http://www.jcraft.com/jsch/) in SSH nel server con nome utente e password noti ed eseguire il comando. Grazie a tutti per i vostri suggerimenti!

+0

per favore aggiungi un esempio qui. – vijendra

7

Aver installato sudo, fare in modo che l'utente esegua il programma Java immesso in/etc/sudoers per i comandi in questione e utilizzare sudo -u jim ls ~bob.

+0

Questa non è una soluzione. Sfortunatamente, non posso modificare il sistema in alcun modo, inclusa l'installazione di sudo. –

+2

Quindi è necessario cambiare host. –

+0

D'accordo con Andrew. Se il tuo host non ti permette roba come pubkey SSH, e non puoi nemmeno installare "sudo", allora è probabile che tutto ciò che potresti inventare riguardo al tuo schema "su", mentre forse è possibile, non è permesso dal tuo hoster o, e sei destinato a guai. Trova un hoster che consente sudo, si tratta dell'unica soluzione sensata. – DevSolar

0

Forse un'implementazione java di Expect? ExpectJ si presenta quando su google, ma non sono riuscito a trovare alcuna documentazione relativa all'esecuzione sotto 1.4.2.

+0

Questa potrebbe essere una soluzione. Grazie per il consiglio. –

+0

Bene, ExpectJ sembra funzionare - è riuscito a copiare e creare le dipendenze. Il problema è, tuttavia, ExpectJ utilizza StringBuilder, che non è stato implementato fino all'1.5. Eventuali suggerimenti? –

+0

Puoi chiedere alle persone di ExpectJ se hanno una vecchia versione in giro (non ce n'è una su sourceforge). Se l'unico problema è StringBuilder, dovresti essere in grado di modificare il codice tu stesso. –

0

Si è tentato di reindirizzare i comandi sudo immessi e scritti in quello. Non uso Java da un po ', ma credo che ci sia un modo per ottenere il flusso di input e scrivere su di esso. Potresti usarlo per scrivere la password seguita da una nuova riga e sudo o su dovrebbe accettare la password.

Utilizzare getInputStream() e scrivere la password per quello.

su jim -c ls ~Bob 
-1

Forse questo dovrebbe funzionare:

Process process = Runtime.getRuntime().exec("su jim && ls ~bob"); 

OutputStream standardInput = process.getOutputStream(); 
Writer standardInputWriter = new OutputStreamWriter(standardInput); 
standardInputWriter.write("password\n"); 
standardInputWriter.close(); 
+0

Grazie, ma non ha funzionato. Ho provato qualcosa di simile prima, ma con circa lo stesso risultato. –

-1

Non sono sicuro di questo codice:

Process p = Runtime.getRuntime().exec("su jim && ls ~bob"); 

verrà eseguita in un guscio, necessarie per valutare il & &, cioè un comando di shell (/ bin/sh). Dovresti passare il comando "ls ~ bob" tramite una riga di comando swith di su.Qualcosa del tipo:

su jim -c 'ls ~bob' 
+0

Stesso risultato della risposta precedente. –

+0

quindi SSH imho è l'unica opzione valida – dfa