Maison > Java > javaDidacticiel > le corps du texte

Pourquoi les commandes Unix échouent-elles avec des erreurs « Not Found » lors de leur exécution via JSch en Java ?

Patricia Arquette
Libérer: 2024-11-12 00:33:02
original
973 Les gens l'ont consulté

Why do Unix commands fail with

Échec de l'exécution des commandes Unix avec une erreur « Introuvable » via JSch

Lors de la tentative d'exécution de certaines commandes Unix via la bibliothèque JSch en Java, les utilisateurs peuvent rencontrer des erreurs indiquant que la commande est introuvable.

Comprendre le Problème

Contrairement à un client SSH interactif, le canal "exec" de JSch n'attribue pas de pseudo terminal (PTY) par défaut. Cette différence d'environnement peut conduire à des exécutions de scripts de démarrage et à des configurations de PATH variables par rapport aux sessions interactives. Par conséquent, les commandes qui reposent sur des variables d'environnement spécifiques peuvent échouer.

Identification de la cause première

Pour confirmer la cause première, désactivez l'allocation PTY dans votre client SSH et essayez de exécutez la commande manuellement. Si vous rencontrez la même erreur « introuvable », cela suggère que la variable d'environnement PATH diffère entre les sessions interactives et non interactives.

Solutions

Pour résoudre ce problème , envisagez les solutions suivantes par ordre de préférence :

1. Modifiez la commande pour définir explicitement le chemin d'accès à l'exécutable

String command = "/bin/air sandbox run <graph-path>";
Copier après la connexion

2. Ajustez les scripts de démarrage pour définir le PATH de manière cohérente

Assurez-vous que le PATH est défini de manière identique pour les sessions interactives et non interactives dans les scripts de démarrage sur le serveur distant.

3. Utilisez le shell de connexion pour exécuter la commande

Préparez la commande de "bash --login -c" pour l'exécuter explicitement via le shell de connexion, qui définit généralement un environnement cohérent :

String command = "bash --login -c \"air sandbox run <graph-path>\"";
Copier après la connexion

4. Définissez les variables d'environnement directement dans la commande

Pour les commandes qui dépendent fortement d'une configuration d'environnement spécifique, envisagez de définir les variables directement dans la commande :

String command = "PATH=\"$PATH;/path/to/air\" && air sandbox run <graph-path>";
Copier après la connexion

5. Allocation PTY forcée (non recommandée)

En dernier recours, vous pouvez forcer l'allocation PTY pour le canal "exec" en utilisant .setPty(true). Cependant, cette approche peut introduire des effets secondaires indésirables.

Pour obtenir des informations supplémentaires et des problèmes similaires, reportez-vous aux ressources suivantes :

  • Certaines commandes Unix échouent avec "... not found" , lorsqu'elles sont exécutées via Java à l'aide de 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 au canal "exec" ?
  • La commande (.4gl) exécutée avec SSH.NET SshClient.RunCommand échoue avec "Aucun fichier ou répertoire de ce type"

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal