L'exécution des commandes linux sur java par JSch
Je suis l'établissement d'une connexion ssh à travers JSch sur java et tout semblait fonctionner correctement, jusqu'à ce que j'ai essayé de l'exécuter .sh fichier. Le script shell est le nom de repoUpdate.sh et c'est très simple:
echo ' ****Repository update****'
echo ' Location: /home/cissys/repo/'
echo -e ' Command: svn update /home/cissys/repo/2.3.0'
svn update /home/cissys/repo/2.3.0
C'est le résultat que j'obtiens directement sur la console linux avec la bonne réponse de la commande:
[cissys@dsatelnx5 ~]$ repoUpdate.sh
****Repository update****
Location: /home/cissys/repo/
Command: svn update /home/cissys/repo/2.3.0
At revision 9432.
Maintenant, voici le code java de ma méthode avec la connexion ssh qui essaie de les appeler ce même fichier
public void cmremove()
{
try
{
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
UserInfo ui = new SUserInfo(pass, null);
session.setUserInfo(ui);
session.setPassword(pass);
session.connect();
ChannelExec channelExec = (ChannelExec)session.openChannel("exec");
InputStream in = channelExec.getInputStream();
channelExec.setCommand("./repoUpdate.sh");
channelExec.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
int index = 0;
while ((line = reader.readLine()) != null)
{
System.out.println(++index + " : " + line);
}
channelExec.disconnect();
session.disconnect();
System.out.println("Done!");
}
catch(Exception e)
{
System.err.println("Error: " + e);
}
}
Et la réponse que j'obtiens est le suivant:
run:
1 : ****Repository update****
2 : Location: /home/cissys/repo/
3 : Command: svn update /home/cissys/repo/2.3.0
Done!
BUILD SUCCESSFUL (total time: 2 seconds)
avec aucune sortie ou des signes d'exécution sur la commande svn (À la révision 9432) que ce soit.
Je pense qu'il est peut-être la fermeture de la session à un certain point, de ne pas laisser la commande exécuter correctement. Si le updateRepo.sh fichier aurais eu quelque chose comme "cp test.txt test_2.txt", il le ferait sans problème. Mais je n'ai que ce problème avec cela et d'autres spécifiques .sh fichiers.
Toute aide serait appréciée.
\v
) n'est pas un caractère commun, et je pouvais facilement imaginer qu'il cause des problèmes. Avez-vous essayé le script sans elle? (2) Quel est le but de la echo -n
sans argument? N'est-ce pas un no-op?ok. J'ai déjà changé le code pour que cela:
echo ' ****Repository update****' echo ' Location: /home/cissys/repo/' echo -e ' Command: svn update /home/cissys/repo/2.3.0' svn update /home/cissys/repo/2.3.0
mais je suis toujours la même chose exacte de sortie sur la console linux et sur mon java de sortie :\Avez-vous essayer de consommer de flux d'erreur? Juste pour voir si il ya un problème avec votre commande.
mais je n'obtiens pas d'erreur à tous
Mais si vous rencontrez cette sortie, qui semble être ok, quel est votre problème? Sincerally, je n'ai' entendu.
OriginalL'auteur Miguel Ángel | 2012-07-18
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que votre commande shell est erroring arrière, pour quelque raison - peut-être
svn
n'est pas sur votre chemin, peut-être il y a d'autres étranges effets sur l'environnement - mais vous n'obtenez pas la sortie d'erreur, parce que vous n'êtes pas à la recherche pour elle. Normalement, les erreurs sont envoyées sur le flux que vous obtenez à partir dechannelExec.getErrStream
mais dans votre code, vous seulement lu à partir de lagetOutputStream
flux.Pour diagnostiquer cela, vous allez avoir besoin pour obtenir ces messages d'erreur. Il est probablement plus facile de se linux pour utiliser un flux régulier de sortie et les messages d'erreur que d'avoir votre programme java tirant à partir de deux sources à la fois, alors j'aimerais ajouter cette ligne que la ligne du haut de
repoUpdate.sh
:Qui va ensuite entraîner le reste du script pour utiliser un flux que vous êtes en train de lire depuis que la fois d'erreur et de sortie.
Aussi, juste avant d'appeler
chanelExec.disconnect
, dans votre programme java, vous devez enregistrer le code de sortie, puis de changer d' "Fait!" message en fonction de ce qu'il était:Si vous faites cela, vous devriez alors obtenir les messages d'erreur que vous dire pourquoi votre commande ne fonctionne pas comme vous vous attendez à ce qu'il devrait.
OriginalL'auteur Daniel Martin
Voici donc ce que j'ai fait.
J'ai ajouté le
exec 2>&1
en haut de la repoUpdate.sh fichier et a ajouté que le morceau de code pour lire la sortie d'erreur comme @DanielMartin suggéré, résultant sur ce:Alors qu'en réalité a beaucoup aidé. Il a confirmé que la commande a été, en fait, n'exécute pas correctement, comme je le pensais. J'ai été faire cela sur mon java de sortie:
Ensuite, j'ai essayé de modifier le repoUpdate.sh fichier, en ajoutant le chemin absolu pour la commande svn (Merci @ymnk)
Pour mon java, j'ai eu exactement ce que je cherchais:
J'ai trouvé que la
$PATH
- je obtenir à partir de la session par l'intermédiaire de java n'est pas la même que je reçois directement sur la console linux.Ainsi, l'ajout de la svn chemin fait le tour. Merci beaucoup pour votre aide!
OriginalL'auteur Miguel Ángel
Comment utiliser le chemin absolu pour 'svn' commande?
OriginalL'auteur ymnk