Pourquoi ne la lecture d'une sortie de canal shell en JSch jamais finir avec -1?

Jonathan Komar:

J'ai créé un objet appelé Obj qui envoie des messages sur un canal Secure Shell. Je peux envoyer des caractères UTF-8, ce qui signifie que le courant de sortie doit traiter les caractères multi-octets. Voilà pourquoi je décidé d'utiliser un écrivain de flux de sortie en mémoire tampon. Ce n'est pas pertinent, de sorte que le code ne références qu'une partie du code avec un commentaire.

Je voudrais que le flux d'entrée pour traiter également des caractères multi-octets. Je sais que la lecture () fonction du InputStreamReader retourne des entiers qui correspondent à des points de code UTF-16 ou -1. Mes boucles de courant de mise en œuvre et des tests de -1. Il boucles sans fin. Pourquoi?

Code

Voici mon code source

public class Obj {

    public String sendMessage(char[] message) {

        final int CONNECTION_TIMEOUT_MILLISECONDS = 300;
        final int IN_BUFFER_SIZE = 2048;
        int codePoint;
        StringBuilder sbResponse = new StringBuilder();

        try {
            ChannelShell channel = SshChannelFactory.getChannel(this);
            if (channel == null) {
                System.out.println("Unable to acquire channel for object \"{}\"", this);
                throw new RuntimeException();
            }
            channel.connect(CONNECTION_TIMEOUT_MILLISECONDS);
            System.out.println("Successfully opened channel to \"{}\"", channel.getHost());
        }

        /**
         * Write some stuff in this try block.
         */
        //try {
        //} catch

        /**
         * Read the response in this try block.
         */
        char[] buffer = new char[IN_BUFFER_SIZE];
        int bytesReadOffset = 0;
        try {
            BufferedReader fromServerStream = new BufferedReader(new InputStreamReader(channel.getInputStream(), Charset.forName("UTF-8")), IN_BUFFER_SIZE);
            while ((codePoint = fromServerStream.read()) != -1) {
                sbResponse.append((char) codePoint);
            } catch (IOException e) {
              e.printStackTrace();
            }
        return sbResponse.toString();
}

public class SshChannelFactory {

    public static ChannelShell getChannel(Obj obj) {
        return createSshChannel(obj);
    }

    private static Session createSshSession(Obj obj) {
        final JSch jsch = new JSch();
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        try {

            Session session = jsch.getSession(obj.getUser(), obj.getHost(), obj.getPort());
            session.connect();
            return session;
        } catch (JschException e) {
          e.printStackTrace();
          throw new RuntimeException();
        }
    }

    private static ChannelShell createSshChannel() {
        Session session = SSHSessionFactory.createSshSession(Obj obj)
        try {
            ChannelShell channel = (ChannelShell) session.openChannel("shell");
            channel.setPty(true);
            channel.setInputStream(null);
            channel.setOutputStream(null);
            return channel;
        } catch (JSchException e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
}
Martin Prikryl:

Le canal « shell » ouvre un shell.

Nous ne savons pas ce que votre code ne fait. Mais je suppose que vous envoyez une commande au shell à exécuter et vous essayez de lire la sortie de commande. Et vous attendez probablement obtenir -1 une fois que les extrémités de sortie de commande. Vous ne.

Les extrémités de flux de sortie de la coquille, que lorsque les extrémités de la coquille. Et pour cela vous devez envoyer une commande comme exit.


En général, vous ne devriez pas utiliser le canal « shell » . Il est destiné à la mise en œuvre d' une session shell interactif (comme si vous implémentez votre propre terminal SSH). C'est quelque chose que vous faites rarement.

Pour automatiser une exécution de la commande, utilisez le canal « exec ».

Voir aussi Quelle est la différence entre le canal « shell » et le canal « exec » dans JSch .

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=228684&siteId=1
conseillé
Classement