Certaines commandes Unix échouent avec l'erreur « Commande introuvable » lorsqu'elles sont exécutées via Java à l'aide de JSch
Ce problème survient lors de l'exécution de commandes Unix via Java en utilisant la bibliothèque JSch. Lorsqu'une commande telle que "air not found" échoue, même si elle fonctionne dans un client SSH, une enquête plus approfondie est justifiée.
Cause fondamentale :
Contrairement à une session SSH interactive, le canal "exec" dans JSch n'attribue pas de pseudo-terminal. Cela peut entraîner l'exécution d'un ensemble différent de scripts de démarrage, conduisant à un environnement différent. Dans ce cas, la variable d'environnement PATH peut être définie différemment, entraînant l'indisponibilité de l'exécutable "air".
Solutions :
Il existe plusieurs méthodes pour résoudre ce problème. problème, par ordre de préférence :
-
Exécution du chemin complet :
Utiliser le chemin complet vers l'exécutable dans la commande, éliminant ainsi la dépendance à l'égard de l'environnement.
-
Modification du script de démarrage :
Ajustez les scripts de démarrage pour définir le PATH de manière cohérente pour les versions interactives et non interactives. sessions.
-
Exécution du shell de connexion :
Exécuter la commande explicitement via une connexion shell, en utilisant le commutateur --login.
-
Modification de l'environnement :
Modifiez l'environnement dans la commande elle-même pour définir le PATH nécessaire et/ou d'autres variables.
-
Allocation forcée du pseudo-terminal :
(Non recommandé) Forcer l'allocation du pseudo-terminal pour l'"exécutif" canal utilisant setPty(true), mais soyez conscient des effets secondaires potentiels.
Problèmes connexes :
D'autres problèmes similaires ont été rencontrés et discutés dans ce qui suit ressources :
- Certaines commandes Unix échouent avec "... not found", lorsqu'elles sont exécutées via Java en utilisant JSch, même avec setPty activé
- Les commandes exécutées à l'aide de JSch se comportent différemment que dans le terminal SSH (contourne le message d'invite de confirmation de "oui/"non")
- JSch : existe-t-il un moyen d'exposer les variables d'environnement utilisateur à "exec " ?
- La commande (.4gl) exécutée avec SSH.NET SshClient.RunCommand échoue avec "Aucun fichier de ce type ou répertoire"
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!