java - JSch - 命令没有发送到 shell?

标签 java jsch

我正在开发一个项目,使用 JSch 在远程服务器上的屏幕中重新启动某些内容...但是我遇到了问题。它会在 100% 的情况下发送前 2 个命令,但第三个命令只会在某些情况下发送。任何帮助将不胜感激。

public static void stopServer(String name, String ip, String passwd)
{
    try {
        Session session = Main.jsch.getSession("user",ip,22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword(passwd);
        session.connect();
        Channel channel = session.openChannel("shell");
        channel.connect();
        ChannelShell cs = (ChannelShell) channel;
        cs.setPty(true);
        DataInputStream dataIn = new DataInputStream(channel.getInputStream());
        PrintStream dataOut = new PrintStream(channel.getOutputStream());
        dataOut.println("screen -x "+name);
        dataOut.flush();
        dataOut.println("stop");
        dataOut.flush();
        String line = dataIn.readLine();
        System.out.println(line);
        while(true) {
            line = dataIn.readLine();
            System.out.println(line);
            if(line.contains("\"quit\""))
            {
                break;
            }
        }
        TimeUnit.SECONDS.sleep(1);
        dataOut.println("quit");
        dataOut.flush();
        System.out.println("Shutdown");
        dataIn.close();
        dataOut.close();
        channel.disconnect();
        session.disconnect();

    }catch(Exception e)
    {
        e.printStackTrace();
    }
}

根据我所见,这会发送屏幕 -x 'name' 和停止 100% 的时间,但 'quit' 命令实际上仅在一小部分时间内被控制台发送/理解。任何帮助将不胜感激!!

最佳答案

我设法以不使用 shell channel 的方式解决了这个问题,但它足够可靠,可以工作:

//Start EXEC
            ChannelExec ce = (ChannelExec) session.openChannel("exec");
            ce.setCommand("screen -S " + name + " -X stuff 'quit\n'");
            ce.setInputStream(null);
            ce.setErrStream(System.err);
            InputStream in=ce.getInputStream();

            ce.connect();

            byte[] tmp=new byte[1024];
            while(true){
                while(in.available()>0){
                    int i=in.read(tmp, 0, 1024);
                    if(i<0)break;
                    //System.out.print(new String(tmp, 0, i));
                }
                if(ce.isClosed()){
                    if(in.available()>0) continue;
                    //System.out.println("exit-status: "+ce.getExitStatus());
                    break;
                }
                try{Thread.sleep(1000);}catch(Exception ee){}
            }
            ce.disconnect();
            //STOP EXEC

尽管这并不符合问题的本质,但它为我解决了问题。

关于java - JSch - 命令没有发送到 shell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28563339/

相关文章:

java - 用java发送soap消息

java - 返回格式化字符串无法正常工作

java - "Cannot find symbol error"在我的三角形类中

java - 如何在java中模拟SHIFT +鼠标按键

java - 使用 JSch 时重命名命令不起作用

java - 注入(inject)静态属性值

java - 使用 JSch 从 SSH 服务器读取命令输出时获取不需要的字符

java - 寻找 java SFTP 现代库,而不是 jsch

java - 使用 "exec" channel 的 JSch SCP 文件传输