美文网首页PHP程序猿Java学习笔记程序员
JSch-远程调用linux命令和文件上传

JSch-远程调用linux命令和文件上传

作者: 献给记性不好的自己 | 来源:发表于2017-01-04 17:25 被阅读81次

    pom.xml配置依赖

            <dependency>
                <groupId>com.jcraft</groupId>
                <artifactId>jsch</artifactId>
                <version>0.1.53</version>  
            </dependency> 
    
    

    一、远程调用linux命令

    1、如果服务器只是单纯的用户名,密码登录代码如下:

    public class RemoteShellUtils {
        private static final Logger LOG = Logger.getLogger(RemoteShellUtils.class);
        private Channel channel = null;
        private Session session = null;
        // 用户名
        private static String user;
        // 密码
        private static String passwd;
        // ip地址
        private static String host;
        // 端口号
        private static int port;
    
        static {
            InputStream in = ClassLoader
                    .getSystemResourceAsStream("store.properties");
            Properties prop = new Properties();
            try {
                prop.load(in);
                user = prop.getProperty("server.user");
                passwd = prop.getProperty("server.passwd");
                host = prop.getProperty("server.host");
                port = Integer.valueOf(prop.getProperty("server.port"));
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 获取session
         * 
         * @param user服务器用户名
         * @param passwd服务器密码
         * @param host服务器ip地址
         * @param port服务器端口号
         * @return
         * @throws JSchException
         */
        public Session getSession() throws JSchException {
            // 创建JSch对象
            JSch jsch = new JSch();
            session = jsch.getSession(user, host, port);
            LOG.info("session创建成功");
            // 设置密码
            session.setPassword(passwd);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            // 设置timeout时间
            session.setTimeout(timeout);
            // 通过Session建立连接
            session.connect();
            LOG.info("session连接成功");
            return session;
        }
    
        /**
         * 创建ChannelExec
         * @return
         * @throws JSchException
         */
        private ChannelExec getExecChannel() throws JSchException {
            if (session == null) {
                session = getSession();
            }
            // 打开SFTP通道
            channel = session.openChannel("exec");
            // LOG.info("Connected successfully to " + host + ":" + port);
            return (ChannelExec) channel;
        }
        /**
         * 执行shell命令
         * 
         * @param command
         */
    
        public boolean execShell(String command) {
            BufferedReader reader = null;
                channel = getExecChannel();
                ((ChannelExec) channel).setCommand(command);
                channel.setInputStream(null);
                channel.connect(); // 建立SFTP通道的连接
                InputStream in = channel.getInputStream();
                reader = new BufferedReader(new InputStreamReader(in));
                String buf = null;
    
                while ((buf = reader.readLine()) != null) {
                    System.out.println(buf);
                }
            }
          /**
          *关闭连接资源
          */
          public void closeChannel() {
            if (channel != null) {
                channel.disconnect();
            }
            if (session != null) {
                session.disconnect();
            }
        }
        }
    
    

    2、如果服务器是秘钥加密码登录,则创建session方法需要修改

        /**
         * 获取session
         * 
         * @param user
         * @param passwd
         * @param host
         * @param port
         * @return
         * @throws JSchException
         */
        public Session getSession() throws JSchException {
            // 创建JSch对象
            JSch jsch = new JSch();
        // 根据用户名,主机ip,端口号,获取一个Session对象
            //获取秘钥
            String privateKey = ClassLoader.getSystemResource("lie_rsa").getPath()
                .substring(1);
            jsch.addIdentity(privateKey, passwd);
            session = jsch.getSession(user, host, port);
            LOG.info("session创建成功");
            // 设置密码
            //session.setPassword(passwd);
            java.util.Properties config = new java.util.Properties();
            config.put("StrictHostKeyChecking", "no");
            session.setConfig(config);
            // 设置timeout时间
            session.setTimeout(timeout);
            // 通过Session建立连接
            session.connect();
            LOG.info("session连接成功");
            return session;
        }
    

    二、上传文件

        /**
         * 文件上传
         * 
         * @param src本地文件路径
         * @param dst上传到服务器的地址
         */
        public void uploadFile(String src,String dst) {
            ChannelSftp channelSftp = null;
            FileInputStream fileInputStream = null;
            channelSftp = getSFTPChannel();
            fileInputStream = new FileInputStream(src);
            channelSftp.put(fileInputStream,dst,ChannelSftp.OVERWRITE);
        }
    

    相关文章

      网友评论

        本文标题:JSch-远程调用linux命令和文件上传

        本文链接:https://www.haomeiwen.com/subject/qrtavttx.html