11
votes

Java, Runtime.Exec ou ProcessBuilder: Comment savoir si le fichier est shell ou binaire?

Je suis très efficace de décider: strong>

  • devrais-je prépréer la ligne de commande fournie par l'utilisateur avec l'exécutable Shell li>
  • Si oui, qu'est-ce que cet exécutable serait-il? (/ bin / sh? / usr / bin / perl? / usr / bin / ksh? C: /../ cmd.exe?) li> ul>

    Il est connu que pour démarrer un script shell à partir de Java, il faut démarrer la coque à la place: P>

    ProcessBuilder pb = new ProcessBuilder("script.sh", "arg1", "arg2);
    (error 2: file not found)
    


2 commentaires

Votre script shell a-t-il une ligne de shebang appropriée ( #! ) en haut? Si tel est le cas, vous pouvez simplement demander au noyau de l'exécuter (aussi longtemps que c'est + x exécutable) sans être préoccupé par l'interprète de commande dont il pourrait avoir besoin.


Je ne peux pas savoir. Le script provient des utilisateurs finaux, non fournis avec le logiciel.


3 Réponses :


2
votes

Une solution possible consiste à générer un script qui enveloppe le script / binaire exécutant de votre programme. De cette façon, vous savez que c'est toujours un script. Le script généré exécute simplement le script / binaire interne et renvoie le code d'erreur (et éventuellement redirige l'entrée / la sortie). Lorsque vous avez terminé, vous pouvez simplement le supprimer. Java vous permet de créer des fichiers temporaires très facilement.


0 commentaires

3
votes

Il devrait s'agir d'un drapeau rouge que vous devez sauter à travers ces cerceaux juste pour exécuter une commande. Tout d'abord parce que cela devient vraiment compliqué, et deuxièmement, parce que Java a été conçu pour être indépendant de la plate-forme. Lorsque vous enquêtez sur des hacks spécifiques au système d'exploitation pour faire des classes intégrées, vous devez reculer et réexaminer vos hypothèses. XXX PRE>

Notez que le message d'erreur est "Fichier introuvable", pas "Impossible d'exécuter le script shell" ou une certaine erreur. La cause la plus probable pour cette erreur n'est pas que vous exécutez un script, mais que le script est introuvable. P>

Si le script est dans le répertoire actuel, vous devez ajouter un ./ code> devant. Si vous ne mettez pas de chemin explicite à l'exécutable, l'exécutable doit réside dans l'un des répertoires de votre CORET CODE> Variable d'environnement. Le répertoire actuel . Code> est généralement pas em> inclus dans $ chemin code> par défaut. P>

ProcessBuilder pb = new ProcessBuilder("./script.sh", "arg1", "arg2);


1 commentaires

Merci de forcer-rincer mon cerveau. En effet, ./script aide ... au moins partiellement.



0
votes

sur

ProcessBuilder PB = Nouveau processbuilder ("/ bin / sh", "/ chemin / binaire", "arg1", "arg2); (SH: impossible d'exécuter un fichier binaire)

ProcessBuilder PB = nouveau processus de processus ("/ bin / sh", "-c", "/ chemin / binaire", "arg1", "arg2); (SH: impossible d'exécuter un fichier binaire)

Une option est d'accepter le chemin d'interprète comme un autre argument (probablement à partir d'une liste de valeurs connues) des utilisateurs.

(Cela aurait pu être un commentaire. Je ne pouvais pas obtenir le formatage à droite)


0 commentaires