2009-06-18 12 views
13

Der Versuch, ein Java-Programm zu schreiben, das einen UNIX-Befehl als anderer UNIX-Benutzer ausführen kann. Ich habe das Passwort des Benutzers, und ich kenne den Befehl, den ich ausführen möchte, aber der Befehl muss als dieser Benutzer ausgeführt werden - also muss ich mich zuerst als dieser Benutzer anmelden.Ausführen von UNIX-Befehlen als anderer Benutzer, von Java

Zum Beispiel: Sagen wir, wir haben einen Benutzer, Jim, der sehen will, was in bobs Home-Verzeichnis ist, und (aus welchen Gründen auch immer) jim hat Zugriff auf ls, während bob nicht tut. Wir sind derzeit als Bob angemeldet. Hier ist das, was wir (könnten) tun:

[email protected]$ su jim && ls ~bob 

Problem ist, erhalten wir für Jims Passwort gefragt. Da dies von einem Java-Programm ausgeführt wird, d. H.

werden wir aufgefordert, für das Passwort von jim aufgefordert und aufgelegt. Wir kennen Jims Passwort. Ich kann es jedoch nicht eingeben.

Zusätzlich können wir kein Expect-Skript verwenden (nicht installiert haben) und wir können nicht der Superuser werden. Ich sah auch in SSH verwenden, dies zu versuchen, da wir technisch

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

, aber dies wird auch nicht funktionieren, da ich keine Berechtigung zum Setup passwordless SSH.

Meine letzte Bemühung ist es, eine SSH-Bibliothek für Java zu verwenden, da das Kennwort für das Java-Programm verfügbar ist und ich mich damit anmelden (und den richtigen Befehl ausführen könnte). Aber da ich auf dem gleichen Host laufen werde, scheint es Overkill zu sein.

Irgendwelche Vorschläge?

P.S: Java Version 1.4.2, kann nicht aktualisiert werden; AIX UNIX 5.3.

+0

konnten Sie einen Workaround finden, ohne eine Drittanbieter-Bibliothek zu verwenden, wenn ja, können Sie bitte teilen? – HyperioN

Antwort

6

Problem gelöst. Benutzte JSch (http://www.jcraft.com/jsch/) an SSH in den Server mit bekanntem Benutzernamen und Passwort und Befehl ausführen. Vielen Dank für Ihre Vorschläge!

+0

Bitte fügen Sie ein Beispiel hier hinzu. – vijendra

7

Haben Sie sudo installiert, lassen Sie den Benutzer das in/etc/sudoers eingegebene Java-Programm für die betreffenden Befehle ausführen und verwenden Sie sudo -u jim ls ~bob.

+0

Dies ist keine Lösung. Leider kann ich das System nicht ändern - einschließlich der Installation von sudo. –

+2

Sie müssen dann Hosts wechseln. –

+0

Stimmen Sie mit Andrew überein. Wenn dein Host dir Sachen wie Pubkey-SSH nicht erlaubt und du nicht einmal "sudo" installiert bekommen kannst, dann ist die Chance, dass du etwas über dein "su" -Schema erfährst, obwohl es vielleicht möglich ist, von deinem Hoster nicht erlaubt entweder und du bist in Schwierigkeiten geraten. Finde einen Hoster, der sudo erlaubt, es ist die einzig vernünftige Lösung. – DevSolar

0

Möglicherweise eine Java-Implementierung von Expect? ExpectJ kommt beim googlen auf, aber ich konnte keine Dokumentation über das Laufen unter 1.4.2 finden.

+0

Dies könnte eine Lösung sein. Danke für den Tipp. –

+0

Nun, ExpectJ sieht so aus, als müsste es funktionieren - es wurde geschafft, die Abhängigkeiten zu kopieren und zu erstellen. Problem ist jedoch, ExpectJ verwendet StringBuilder, die nicht bis 1.5 implementiert wurde. Irgendwelche Vorschläge? –

+0

Sie können die ExpectJ Leute fragen, ob sie eine alte Version haben (es gibt keine auf Sourceforge). Wenn das einzige Problem der StringBuilder ist, sollten Sie in der Lage sein, den Code selbst zu ändern. –

0

Haben Sie versucht, die Eingabe von sudo-Befehlen umzuleiten und darauf zu schreiben. Ich habe Java seit einiger Zeit nicht mehr verwendet, aber ich glaube, es gibt eine Möglichkeit, den Eingabestream zu erhalten und darauf zu schreiben. Sie könnten das verwenden, um das Passwort zu schreiben, gefolgt von einer neuen Zeile und sudo oder su sollte das Passwort akzeptieren.

Verwenden Sie getInputStream() und schreiben Sie Ihr Passwort dazu.

su jim -c ls ~Bob 
-1

Vielleicht ist dies funktionieren würde:

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

Danke, aber es hat nicht funktioniert. Ich habe schon einmal etwas Ähnliches versucht, aber ungefähr mit dem gleichen Ergebnis. –

-1

Ich bin nicht sicher, ob dieser Code:

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

wird in einer Shell ausgeführt werden, erforderlich, um die & & zu bewerten, das heißt ein Shell-Befehl (/ bin/sh). Sie sollten den Befehl "ls ~ bob" über eine Befehlszeile swith von su übergeben.Etwas wie:

su jim -c 'ls ~bob' 
+0

Gleiches Ergebnis wie oben. –

+0

dann SSH imho ist die einzige praktikable Option – dfa