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.

È stato utile?

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'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top