L'envoi de commandes au serveur via JSch shell canal
Je peux pas comprendre comment je peux envoyer des commandes via JSch shell canal.
Je le fais, mais ça ne fonctionne pas:
JSch shell = new JSch();
String command = "cd home/s/src";
Session session = shell.getSession(username, host, port);
MyUserInfo ui = new MyUserInfo();
ui.setPassword(password);
session.setUserInfo(ui);
session.connect();
channel = session.openChannel("shell");
fromServer = new BufferedReader(new InputStreamReader(channel.getInputStream()));
toServer = channel.getOutputStream();
channel.connect();
toServer.write((command + "\r\n").getBytes());
toServer.flush();
et puis j'ai lu entrée comme ceci:
StringBuilder builder = new StringBuilder();
int count = 0;
String line = "";
while(line != null) {
line = fromServer.readLine();
builder.append(line).append("\n");
if (line.endsWith(".") || line.endsWith(">")){
break;
}
}
String result = builder.toString();
ConsoleOut.println(result);
- Quel est le message d'erreur? Est-il un suivi de pile?
- Il n'y a pas de message d'erreur, j'ai juste ne pas obtenir n'importe quel message de retour. Le programme s'arrête à la ligne = fromServer.readLine(), ce qui signifie que le message n'a pas été envoyé...au moins, je crois...
- Mai de cette aide: jcraft.com/jsch/examples
- 🙂 Je travaillais à la suite de ces exemples... Thnx anw:)
- L'échantillon est jcraft.com/jsch/examples/Shell.java, ça marche vraiment bien. Elle ne fait qu'Système.dans et du Système.qui trouver leur chemin entre les canalisations de ruisseaux et de la console. Mais quand je me suis connecté à l'hôte distant via ssh, BufferedReader.readLine() ne serait jamais retourné. Autour de a été de lire bloc d'octets au lieu de chaînes de caractères et de la construction de Chaîne manuellement.
Vous devez vous connecter pour publier un commentaire.
Si elle bloque
readLine()
cela signifie que votre "tout" ne se termine jamais (peut-être peu probable compte tenu de votre code), ou,readLine()
est en attente de sa source, à savoir leIOstream
bloque le thread causeavailable()!=true
.Je n'arrive pas à résoudre vos problèmes de code sans voir vos informations de débogage. Mais comme un conseil, avez-vous essayé
PipedIntputStream
? L'idée est de tuyau de votre console d'entrée à "votre" sortie de sorte que vous pouvez "écrire" il. Pour ce faire, vous devez initialiser le in/out-put.Il en va de même à votre question, comment faire pour lire la sortie de la console.
Et encore une fois, si vous n'êtes pas sûr de savoir comment beaucoup de lignes à lire et donc à utiliser "bien que", assurez-vous de faire quelque chose à l'intérieur tout pour empêcher 1) occupé-en attente 2) la fin de condition. Exemple:
read()
mais peut-être que mon raisonnement était plus grand ne pas nuire à la logique.Essayez ceci:
if (i < 0) break;
, après s'être assuré que l'inputstream a des données disponibles, est-il possible que la lecture de ces données serait de retour négatif d'un nombre indiquant la quantité de données à lire ?! Pourquoi avait-il indiquer qu'il a données disponibles, en premier lieu ?!Qui suit a été rapidement un code écrit pour ma mission. Pas un bien fait programme.
Mais il sert son but.
Le code suivant:
Avec les canalisations d'entrée et de sortie des flux semble intéressant:
Je me rends compte que c'est un vieux thread, mais j'ai lutté avec un problème similaire aujourd'hui.
C'est ma solution.
À l'aide de cette classe, vous pouvez simplement faire quelque chose comme :
shell = new ChannelConsole(this.session);
String result = shell.execute("quota -v; echo; echo \"Disk storage information:\"; df -hk")
essayer cette
Utilisation:
La mise en œuvre
essayez ce code :