2010-09-18 5 views
3

est-il possible d'appeler un shellscript ou le shellcode dans une classe java?Appelez un script shell dans Java?

Mon code (dans une méthode statique):

Runtime rtime = Runtime.getRuntime(); 
Process child = rtime.exec("/bin/bash"); 
BufferedWriter outCommand = new BufferedWriter(new 
OutputStreamWriter(child.getOutputStream())); 
outCommand.write("streamer -c /dev/video0 -b32 -o test.jpeg"); 
outCommand.flush(); 
outCommand.close(); 
child.destroy(); 

Mais je reçois cette erreur, si je tente ce code dans ma page jsp (de tomcat6):

java.security.AccessControlException: accès denied (java.io.FilePermission/bin/bash execute)

Une solution à ce problème?

EDIT: ls -l/bin/bash me montre la ligne follwing:

-rwxr-xr-x 1 root root 875596 2009-09-14 07:09/bin/bash

Merci

+1

Utilisez-vous une version packagée de Tomcat? Si oui, il s'agit d'autorisations très restrictives. –

+0

Hmm .. ne sais pas juste téléchargé apt-get install tomcat6 – Benni

Répondre

1

Essayez de désactiver le gestionnaire de sécurité. Modifier /etc/init.d/tomcat6 et changer:

TOMCAT_SECURITY=yes 

changement qui à:

TOMCAT_SECURITY=no 

Et puis redémarrez Tomcat:

/etc/init.d/tomcat6 restart 

Si cela fonctionne, il est à vous de voir si la désactivation complète de la sécurité le gestionnaire est acceptable ou non (l'utiliser est en fait un OMI inhabituel).

1

Si possible, essayez de l'exécuter dans l'appel single exec.

Process p = Runtime.getRuntime().exec(args); 

où args est un tableau de chaînes d'arguments.

String[] args = new String[] {"/bin/bash", "streamer", "-c", "/dev/video0", "-b32", "-o", "test.jpeg" }; 
+0

Oui, passer les arguments en tant que chaînes individuelles est fortement recommandé, surtout si l'un d'entre eux pourrait être modifié par un utilisateur qui pourrait essayer de faire une injection de code shell. – jbindel

3

Si vous voulez garder le fonctionnement du responsable de la sécurité, et vous pouvez avoir de bonnes raisons de le faire, vous pouvez simplement modifier le fichier de stratégie que Tomcat utilise. Les fichiers peuvent être situés dans /var/lib/tomcat6/conf/policy.d.

A nice SO thread discusses this déjà. Même si vous accordez AllPermissions à votre application, l'exécution avec le SecurityManager vous permettra d'utiliser des bacs à sable avec une sécurité limitée. Vous voudrez peut-être faire cela, par exemple, pour exécuter JavaScript qui pourrait être téléchargé lors de l'exécution ou quelque chose de similaire, ou il peut y avoir un autre code dans votre application que vous n'avez pas confiance pour une raison quelconque.

+0

Je veux dire "sandboxes avec des permissions limitées." – jbindel

+0

Et s'il y a plus d'une application Web en cours d'exécution, vous ne voulez peut-être pas qu'elles aient toutes leur place libre. – jbindel