2011-07-12 5 views
0

J'ai écrit un code SSH dans les serveurs et exécute un fichier Java avec des arguments.Impossible d'exécuter ma commande après SSH dans le serveur distant

Le problème auquel je fais face est que le code réussit SSH en mais il n'exécute pas la commande après cela. Étrangement Si je cours la commande du serveur seul cela fonctionne. Des suggestions sur ce s'il vous plaît? Voici le code:

public void getSSH(String code, String newCode, JspWriter out){ 

    try{ 
     File f = new File("/usr/site/html/Output.txt"); 
     BufferedWriter output = new BufferedWriter(new FileWriter(f)); 
     String Servers[] = {"[email protected]","[email protected]","[email protected]","[email protected]"}; 
     for(int i =0;i<Servers.length && i<1 ;i++){ 

      Process p = Runtime.getRuntime().exec("/usr/site/swapimages.sh "+Servers[i]+" '/root/testRemote.sh "+ code+" "+ newCode+"'"); 
      out.println("/usr/site/swapimages.sh "+Servers[i]+" '/root/testRemote.sh "+ code+" "+ newCode+"'"+"<br>"); 
      Utils.waitFor(10000); 
     } 

    } 
} 

J'ai aussi recommandé JSch mais n'ont pas examiné encore.

+0

exécute-t-il la commande après la fin de la session SSH? – trutheality

+0

Il n'y a qu'un seul ... exec() là-bas, donc je m'attendrais seulement à ce qu'il exécute une commande (... swapimages.sh). Vous attendiez-vous à ce qu'il exécute également testRemote.sh dans ce même single ... exec()? Peut-être qu'il me manque quelque chose, mais vous n'avez pas besoin d'une seconde ... exec() pour testRemote.sh? – Straff

+0

Oui, je cours le testRemote.sh dans la même commande exec mais cela a fonctionné quand je l'ai juste couru sur le serveur .. – uppaljaskaran

Répondre

1

La raison pour laquelle cela ne fonctionne pas est que les guillemets dans cette version n'ont pas le même effet que sur la ligne de commande. Lorsque vous appelez SSH à partir de bash, vous placez la commande remote entre guillemets afin qu'elle soit interprétée comme un seul argument. Bash fait la séparation des arguments pour vous. Avec exec, Java divise les arguments pour vous. Le documentation for exec décrit comment il se sépare. Il utilise un StringTokenizer, ce qui est assez bête et sépare la ligne en fonction des espaces (en ignorant les guillemets). Cela signifie que l'ensemble des arguments passés dans la commande est quelque chose comme:

{ "/usr/site/swapimages.sh", "[email protected]", "'/root/testRemote.sh", 
    code, newCodeContents + "'" } 

Il pourrait être encore plus si les chaînes code ou newCode ont des espaces en eux. Notez que votre commande est composée de plusieurs éléments dans le tableau et sera donc traitée comme plusieurs arguments par ssh. En outre, ssh va réellement essayer d'exécuter une commande qui se trouve dans un répertoire nommé '. Ce que vous voulez passer, cependant, est:

{ "/usr/site/swapimages.sh", "[email protected]", 
    "/root/testRemote.sh " + codeContents + " " + newCodeContents } 

avis qu'il n'y a pas de guillemets et la commande entière est le troisième élément du tableau.

Donc, vous avez juste besoin de créer manuellement le tableau de chaînes et utiliser l'autre forme de exec qui prend un tableau de chaînes et qui devrait résoudre le problème.

+0

Vous pouvez également utiliser 'ProcessBuilder' pour vous aider. – msandiford

+0

Merci 101100 .. ouais c'était le problème! J'ai écrit sur une seule chaîne de ma commande et ça a marché !! :) – uppaljaskaran

Questions connexes