Question

Tentative d'écriture d'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 que cet utilisateur - je dois donc me connecter en tant qu'utilisateur.

Par exemple: disons que nous avons un utilisateur, jim, qui veut voir ce qu'il y a dans le répertoire personnel de bob, et (pour quelque raison que ce soit), jim a le droit d'exécuter ls alors que bob n'en a pas. Nous sommes actuellement connectés en tant que bob . Voici ce que nous (pourrions) faire:

bob@host$ su jim && ls ~bob

Le problème, c'est qu'on nous demande le mot de passe de jim. Comme il s’exécute à partir d’un programme Java, c’est-à-dire.

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

on nous demande le mot de passe de jim et on raccroche. Nous connaissons le mot de passe de jim . Cependant, je ne peux pas y entrer.

De plus, nous ne pouvons pas utiliser de script Expect (ne l’installez pas) et nous ne pouvons pas devenir le superutilisateur. J’ai également envisagé d’utiliser SSH pour essayer cela, car nous pourrions techniquement le faire

bob@host$ ssh jim@host "ls ~bob"

mais cela ne fonctionne pas non plus, car je ne suis pas autorisé à configurer SSH sans mot de passe.

Mon dernier effort est d'essayer d'utiliser une bibliothèque SSH pour Java, car le mot de passe est disponible pour le programme Java et je pourrais me connecter avec cela (et exécuter la commande appropriée). Mais puisque je vais utiliser le même hôte, cela semble excessif.

Des suggestions?

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

Était-ce utile?

La solution 2

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

Autres conseils

Faites installer sudo, faites exécuter le programme Java dans le répertoire / etc / sudoers pour les commandes en question et utilisez sudo -u jim ls ~ bob .

Peut-être une implémentation Java d'Expect? ExpectJ s'affiche lorsque vous êtes sur Google, mais je n'ai trouvé aucune documentation concernant l'exécution sous 1.4.2.

Avez-vous essayé de rediriger l’entrée de commandes sudo et d’y écrire? Je n'ai pas utilisé Java depuis un moment, mais je pense 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 devrait accepter le mot de passe.

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

su jim -c ls ~Bob

Peut-être que cela fonctionnerait:

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

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

Je ne suis pas sûr que ce code:

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

sera exécuté dans un shell, nécessaire pour évaluer le & amp; & amp;, c’est une commande shell (/ bin / sh). Vous devez passer la commande & l; ~ ls ~ bob " via une ligne de commande swith de su. Quelque chose comme:

su jim -c 'ls ~bob'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top