使用JSch库在Java中连接Linux服务器

使用JSch库在Java中连接Linux服务器

简介

JSch库能够实现在Java中连接Linux服务器并执行命令、操作文件等功能,支持多种认证方式。其官方网站为 http://www.jcraft.com/jsch/

在Java中,与之类似的库还包括:Apache Mina SSHD http://mina.apache.org/sshd-project/

案例

步骤1:创建Maven项目并添加依赖

pom.xml文件中添加JSch库的依赖:

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
    <dependency>
        <groupId>com.jcraft</groupId>
        <artifactId>jsch</artifactId>
        <version>0.1.55</version>
    </dependency>
</dependencies>

步骤2:编写ShellTest类

创建一个名为ShellTest的Java类,代码如下:

package com.test;

import com.jcraft.jsch.*;

import javax.swing.*;
import java.io.FilterInputStream;
import java.io.IOException;

/**
 * @author Sindrol
 * @date 2020/3/10 11:16
 */
public class ShellTest {

    public static void main(String[] args) throws JSchException {
        JSch jsch = new JSch();
        //jsch.setKnownHosts("C:\\Users\\XXX\\.ssh\\known_hosts");
        String host = JOptionPane.showInputDialog("Enter hostname", "192.168.213.134");
        int port = 22;
        String user = "root";
        Session session = jsch.getSession(user, host, 22);
        String passwd = JOptionPane.showInputDialog("Enter password", "123456");
        session.setPassword(passwd);
        session.setUserInfo(new MyUserInfo());
        session.connect(30000);
        Channel channel = session.openChannel("shell");
        //((ChannelShell)channel).setAgentForwarding(true);
        //解决Windows下输入流的问题
        channel.setInputStream(new FilterInputStream(System.in) {
            @Override
            public int read(byte[] b, int off, int len) throws IOException {
                return in.read(b, off, (len > 1024 ? 1024 : len));
            }
        });
        //channel.setInputStream(System.in);
        channel.setOutputStream(System.out);
        //去除控制台彩色输出
        ((ChannelShell) channel).setPtyType("vt102");
        //((ChannelShell) channel).setEnv("LANG", "zh_CN");
        channel.connect(3 * 1000);
    }

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {
        @Override
        public String getPassword() {
            return null;
        }

        @Override
        public boolean promptYesNo(String message) {
            Object[] options = {"yes", "no"};
            int foo = JOptionPane.showOptionDialog(null,
                    message,
                    "Warning",
                    JOptionPane.DEFAULT_OPTION,
                    JOptionPane.WARNING_MESSAGE,
                    null, options, options[0]);
            return foo == 0;
        }

        @Override
        public String getPassphrase() {
            return null;
        }

        @Override
        public boolean promptPassphrase(String message) {
            return false;
        }

        @Override
        public boolean promptPassword(String message) {
            return false;
        }

        @Override
        public void showMessage(String message) {
            JOptionPane.showMessageDialog(null, message);
        }

        @Override
        public String[] promptKeyboardInteractive(String destination,
                                                  String name,
                                                  String instruction,
                                                  String[] prompt,
                                                  boolean[] echo) {
            return null;
        }
    }
}

步骤3:运行程序

可以直接运行上述程序,或者将其打包成JAR文件后在命令行窗口中运行。运行后,程序会弹出对话框要求输入主机名和密码,之后即可通过命令行与远程Linux服务器进行交互。


使用JSch库在Java中连接Linux服务器
https://www.dearcloud.cn/2020/03/10/20200310-java-jsch/index/
作者
宋兴柱
发布于
2020年3月10日
许可协议