Esecuzione di comandi UNIX come utente diverso, da Java
Domanda
Tentativo di scrivere un programma Java in grado di eseguire un comando UNIX come un altro utente UNIX. 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 tale utente.
Ad esempio: diciamo che abbiamo un utente, Jim, che vuole vedere cosa c'è nella directory home di bob, e (per qualsiasi motivo) jim ha accesso per eseguire ls mentre Bob no. Al momento siamo connessi come bob . Ecco cosa possiamo (potremmo) fare:
bob@host$ su jim && ls ~bob
Il problema è che ci viene richiesta la password di jim. Poiché questo viene eseguito da un programma Java, ad esempio
Process p = Runtime.getRuntime().exec("su jim && ls ~bob");
ci viene richiesta la password di jim e riattaccato. Conosciamo la password di jim . Tuttavia, non posso accedervi.
Inoltre, non possiamo usare uno script Expect (non lo abbiamo installato) e non possiamo diventare il superutente. Ho anche cercato di utilizzare SSH per provare questo, dal momento che potremmo tecnicamente farlo
bob@host$ ssh jim@host "ls ~bob"
ma anche questo non funziona poiché non ho i permessi per configurare SSH senza password.
Il mio ultimo tentativo è quello di provare a utilizzare una libreria SSH per Java, poiché la password è disponibile per il programma Java e sarei in grado di accedere con quello (ed eseguire il comando corretto). Ma dal momento che avrò lo stesso host, sembra eccessivo.
Qualche suggerimento?
P.S: Java versione 1.4.2, impossibile aggiornare; AIX UNIX 5.3.
Soluzione 2
Problema risolto. Utilizzato JSch ( http://www.jcraft.com/jsch/ ) per SSH nel server con nome utente e password noti ed eseguire il comando. Grazie a tutti per i vostri suggerimenti!
Altri suggerimenti
Installa sudo, chiedi all'utente che esegue il programma Java di entrare in / etc / sudoers per i comandi in questione e usa sudo -u jim ls ~ bob
.
Forse un'implementazione Java di Expect? ExpectJ viene visualizzato quando si cerca su Google ma non sono riuscito a trovare alcuna documentazione relativa all'esecuzione in 1.4.2.
Hai provato a reindirizzare l'input dei comandi sudo e scriverci sopra. Non uso Java da un po ', ma credo che ci sia un modo per ottenere il flusso di input e scrivere su di esso. Puoi usarlo per scrivere la password seguita da una nuova riga e sudo o su dovrebbero accettare la password.
Usa getInputStream () e scrivi la tua password.
su jim -c ls ~Bob
Forse questo funzionerebbe:
Process process = Runtime.getRuntime().exec("su jim && ls ~bob");
OutputStream standardInput = process.getOutputStream();
Writer standardInputWriter = new OutputStreamWriter(standardInput);
standardInputWriter.write("password\n");
standardInputWriter.close();
Non sono sicuro che questo codice:
Process p = Runtime.getRuntime().exec("su jim && ls ~bob");
verrà eseguito in una shell, necessario per valutare & amp; & amp ;, ovvero un comando di shell (/ bin / sh). Dovresti passare il comando " ls ~ bob " tramite una riga di comando con su. Qualcosa del tipo:
su jim -c 'ls ~bob'