Commandes multiples via Jsch Shell
J'ai essayé d'exécuter plusieurs commandes via le protocole SSH à l'aide de la JSch de la bibliothèque. Mais il me semble avoir coincé et ne peut pas trouver une solution. Le setCommand()
méthode ne peut exécuter des commandes uniques par session. Mais je veux exécuter les commandes de manière séquentielle comme le connectbot application sur la plateforme Android. Jusqu'à présent, mon code est :
package com.example.ssh;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Properties;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class ExampleSSH extends Activity {
/** Called when the activity is first created. */
EditText command;
TextView result;
Session session;
ByteArrayOutputStream baos;
ByteArrayInputStream bais;
Channel channel;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bais = new ByteArrayInputStream(new byte[1000]);
command = (EditText) findViewById(R.id.editText1);
result = (TextView) findViewById(R.id.terminal);
}
public void onSSH(View v){
String username = "xxxyyyzzz";
String password = "aaabbbccc";
String host = "192.168.1.1"; // sample ip address
if(command.getText().toString() != ""){
JSch jsch = new JSch();
try {
session = jsch.getSession(username, host, 22);
session.setPassword(password);
Properties properties = new Properties();
properties.put("StrictHostKeyChecking", "no");
session.setConfig(properties);
session.connect(30000);
channel = session.openChannel("shell");
channel.setInputStream(bais);
channel.setOutputStream(baos);
channel.connect();
} catch (JSchException e) {
// TODO Auto-generated catch block
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
else{
Toast.makeText(this, "Command cannot be empty !", Toast.LENGTH_LONG).show();
}
}
public void onCommand(View v){
try {
bais.read(command.getText().toString().getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
baos = new ByteArrayOutputStream();
channel.setOutputStream(baos);
result.setText(baos.toString());
}
}
Le code semble se connecter au serveur, mais je pense qu'il y a un problème avec l'entrée et la sortie de la matrice de tampons car il n'y a pas de sortie à tous. Quelqu'un peut-il svp me guider comment gérer l'entrée et la sortie vers et depuis le serveur correctement pour obtenir le résultat souhaité?
source d'informationauteur Piyush
Vous devez vous connecter pour publier un commentaire.
La commande est une Chaîne de caractères et peut être quelque chose à distance de shell accepte. Essayez
pour exécuter plusieurs commandes dans l'ordre. Ou
pour exécuter des commandes jusqu'à ce que l'un tombe en panne.
Même cela peut fonctionner:
ou en Java:
Note: Ne mettez pas de mots de passe et noms d'utilisateurs dans le code. Les mettre dans un fichier de propriété et l'utilisation d'un système de propriété pour spécifier le nom du fichier de propriétés. De cette façon, vous pouvez garder le fichier, même en dehors du projet et assurez-vous que les mots de passe/les noms d'utilisateur n'a pas de fuite.
Si vous n'avez pas à distinguer les entrées ou de sorties des différentes commandes, la réponse d'Aaron (en donnant toutes les commandes en ligne, séparés par
\n
ou;
) c'est bien.Si vous avez à traiter séparément, ou de ne pas savoir le plus tard commandes avant de les précédentes sont fini: Vous pouvez ouvrir plusieurs
exec
-Canaux sur la même Session (c'est à dire la connexion), l'un après l'autre (c'est à dire après le précédent a été fermé). Chacun a sa propre commande. (Mais ils ne partagent pas l'environnement, de sorte qu'uncd
commande dans le premier on n'a pas d'effet sur le tard.)Vous avez simplement à prendre soin de disposer de la Session objet, et ne pas en créer un nouveau pour chaque commande.
Une autre option serait un shell canalet de passer les commandes individuelles pour le shell distant en entrée (c'est à dire par l'intermédiaire d'un flux de données). Mais alors vous devez prendre soin de ne pas mélanger la saisie d'une commande avec la commande suivante (c'est à dire ceci fonctionne seulement si vous savez ce que les commandes sont en train de faire, ou si vous avez un utilisateur interactif, qui offre à la fois d'entrée à la commande et à la prochaine commande, et sait qui l'on est pour être utilisé lors de l'.)
L'installation d'une SCPInfo objet pour contenir le nom d'utilisateur, mot de passe, port:22 et la propriété intellectuelle.