2009-06-18 17 views
13

Vous essayez d'écrire un programme Java capable d'exécuter une commande UNIX en tant qu'utilisateur UNIX différent. J'ai le mot de passe de l'utilisateur, et je connais la commande que je veux exécuter, mais la commande doit être exécutée en tant qu'utilisateur - donc je dois d'abord me connecter comme cet utilisateur. Par exemple: disons que nous avons un utilisateur, jim, qui veut voir ce qui se trouve dans le répertoire personnel de bob, et (pour une raison quelconque) jim a accès à ls alors que bob ne le fait pas. Nous sommes actuellement connectés en tant que bob. Voici ce que nous (pouvons) faire:Exécution de commandes UNIX en tant qu'utilisateur différent, à partir de Java

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

Le problème est que le mot de passe de jim nous est demandé. Étant donné que c'est exécuté à partir d'un programme Java, à savoir

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

nous sommes invités à saisir le mot de passe jim et a raccroché. Nous connaissons le mot de passe de jim. Cependant, je ne peux pas y entrer.

En outre, nous ne pouvons pas utiliser un script Expect (ne l'avez pas installé) et nous ne pouvons pas devenir le super-utilisateur. J'ai aussi regardé en utilisant SSH pour essayer cela, puisque nous pourrions techniquement faire

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

mais cela ne fonctionne pas non plus puisque je n'ai pas la permission d'installer SSH passwordless. Mon dernier effort est d'essayer d'utiliser une bibliothèque SSH pour Java, puisque le mot de passe est disponible pour le programme Java et je serais capable de me connecter avec ça (et d'exécuter la commande appropriée). Mais puisque je vais courir sur le même hôte, il semble que c'est trop.

Des suggestions?

P.S: version Java 1.4.2, impossible de mettre à niveau; AIX UNIX 5.3.

+0

étiez-vous en mesure de trouver une solution de contournement sans utiliser une bibliothèque tierce, si oui pouvez-vous partager? – HyperioN

Répondre

6

Problème résolu. Utilisé JSch (http://www.jcraft.com/jsch/) pour SSH dans le serveur avec le nom d'utilisateur et le mot de passe connus, et exécuter la commande. Merci pour toutes vos suggestions!

+0

s'il vous plaît ajouter un exemple ici. – vijendra

7

Faites installer sudo, demandez à l'utilisateur d'exécuter le programme Java entré dans/etc/sudoers pour les commandes en question et utilisez sudo -u jim ls ~bob.

+0

Ce n'est pas une solution. Malheureusement, je ne peux pas modifier le système de toute façon - y compris l'installation de sudo. –

+2

Vous devez ensuite changer d'hôte. –

+0

D'accord avec Andrew. Si votre hébergeur ne vous permet pas de faire des trucs comme pubkey SSH, et que vous ne pouvez même pas installer "sudo", alors tout ce que vous pourriez trouver concernant votre schéma "su", bien que possible, n'est pas autorisé par votre hébergeur soit, et vous êtes lié pour des ennuis. Trouver un hébergeur permettant sudo, c'est à peu près la seule solution raisonnable. – DevSolar

0

Peut-être une implémentation Java d'Expect? ExpectJ arrive quand googling mais je ne pouvais pas trouver de documentation concernant le fonctionnement sous 1.4.2.

+0

Cela pourrait être une solution. Merci pour le conseil. –

+0

Eh bien, ExpectJ semble fonctionner - il a réussi à récupérer les dépendances et à les construire. Le problème est, cependant, ExpectJ utilise StringBuilder, qui n'a pas été implémenté avant 1.5. Aucune suggestion? –

+0

Vous pouvez demander aux personnes ExpectJ si elles ont une ancienne version (il n'y en a pas sur sourceforge). Si le seul problème est le StringBuilder, vous devriez être capable de modifier le code vous-même. –

0

Avez-vous essayé de rediriger l'entrée des commandes sudo et d'y écrire. Je n'ai pas utilisé Java depuis un moment, mais je crois qu'il existe un moyen d'obtenir le flux d'entrée et d'y écrire. Vous pouvez l'utiliser pour écrire le mot de passe suivi d'une nouvelle ligne et sudo ou su doit accepter le mot de passe.

Utilisez getInputStream() et écrivez votre mot de passe pour cela.

su jim -c ls ~Bob 
-1

Peut-être que cela fonctionne:

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

Merci, mais cela n'a pas fonctionné. J'ai essayé quelque chose de similaire auparavant, mais avec à peu près le même résultat. –

-1

Je ne sais pas ce code:

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

seront exécutés dans une coquille, nécessaire pour évaluer la & &, qui est une commande shell (/ bin/sh). Vous devez passer la commande "ls ~ bob" via une ligne de commande swith de su.Quelque chose comme:

su jim -c 'ls ~bob' 
+0

Même résultat que la réponse ci-dessus. –

+0

puis SSH imho est la seule option viable – dfa