1、java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息。

参考链接:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html

https://www.cnblogs.com/longyg/archive/2012/06/25/2561332.html

https://www.cnblogs.com/qdwyg2013/p/5650764.html#top

引入jar包的maven依赖如下所示:

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

具体演示代码如下所示:

 package com.fline.aic.utils;

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import java.util.Vector; import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException; /**
*
* @Description TODO
* @author biehl
* @Date 2018年10月11日 上午10:20:11
*
* 说明:exec用于执行命令;sftp用于文件处理
*/
public class SSHRemoteCall { // 私有的对象
private static SSHRemoteCall sshRemoteCall; /**
* 私有的构造方法
*/
private SSHRemoteCall() {
} // 懒汉式,线程不安全,适合单线程
public static SSHRemoteCall getInstance() {
if (sshRemoteCall == null) {
sshRemoteCall = new SSHRemoteCall();
}
return sshRemoteCall;
} // 懒汉式,线程安全,适合多线程
public static synchronized SSHRemoteCall getInstance2() {
if (sshRemoteCall == null) {
sshRemoteCall = new SSHRemoteCall();
}
return sshRemoteCall;
} private static final int DEFAULT_PORT = ;// 默认端口号
private int port;// 端口号 private static String ipAddress = "192.168.110.130";// ip地址
private static String userName = "root";// 账号
private static String password = "hadoop";// 密码 private Session session;// JSCH session
private boolean logined = false;// 是否登陆 /**
* 构造方法,可以直接使用DEFAULT_PORT
*
* @param ipAddress
* @param userName
* @param password
*/
public SSHRemoteCall(String ipAddress, String userName, String password) {
this(ipAddress, DEFAULT_PORT, userName, password);
} /**
* 构造方法,方便直接传入ipAddress,userName,password进行调用
*
* @param ipAddress
* @param port
* @param userName
* @param password
*/
public SSHRemoteCall(String ipAddress, int port, String userName, String password) {
super();
this.ipAddress = ipAddress;
this.userName = userName;
this.password = password;
this.port = port;
} /**
* 远程登陆
*
* @throws Exception
*/
public void sshRemoteCallLogin(String ipAddress, String userName, String password) throws Exception {
// 如果登陆就直接返回
if (logined) {
return;
}
// 创建jSch对象
JSch jSch = new JSch();
try {
// 获取到jSch的session, 根据用户名、主机ip、端口号获取一个Session对象
session = jSch.getSession(userName, ipAddress, DEFAULT_PORT);
// 设置密码
session.setPassword(password); // 方式一,通过Session建立连接
// session.setConfig("StrictHostKeyChecking", "no");
// session.connect(); // 方式二,通过Session建立连接
// java.util.Properties;
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);// 为Session对象设置properties
// session.setTimeout(3000);// 设置超时
session.connect();//// 通过Session建立连接 // 设置登陆状态
logined = true;
} catch (JSchException e) {
// 设置登陆状态为false
logined = false;
throw new Exception(
"主机登录失败, IP = " + ipAddress + ", USERNAME = " + userName + ", Exception:" + e.getMessage());
}
} /**
* 关闭连接
*/
public void closeSession() {
// 调用session的关闭连接的方法
if (session != null) {
// 如果session不为空,调用session的关闭连接的方法
session.disconnect();
} } /**
* 执行相关的命令
*
* @param command
* @throws IOException
*/
public void execCommand(String command) throws IOException {
InputStream in = null;// 输入流(读)
Channel channel = null;// 定义channel变量
try {
// 如果命令command不等于null
if (command != null) {
// 打开channel
//说明:exec用于执行命令;sftp用于文件处理
channel = session.openChannel("exec");
// 设置command
((ChannelExec) channel).setCommand(command);
// channel进行连接
channel.connect();
// 获取到输入流
in = channel.getInputStream();
// 执行相关的命令
String processDataStream = processDataStream(in);
// 打印相关的命令
System.out.println("1、打印相关返回的命令: " + processDataStream);
}
} catch (JSchException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
if (channel != null) {
channel.disconnect();
}
} } /**
* 对将要执行的linux的命令进行遍历
*
* @param in
* @return
* @throws Exception
*/
public String processDataStream(InputStream in) throws Exception {
StringBuffer sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String result = "";
try {
while ((result = br.readLine()) != null) {
sb.append(result);
// System.out.println(sb.toString());
}
} catch (Exception e) {
throw new Exception("获取数据流失败: " + e);
} finally {
br.close();
}
return sb.toString();
} /**
* 上传文件 可参考:https://www.cnblogs.com/longyg/archive/2012/06/25/2556576.html
*
* @param directory
* 上传文件的目录
* @param uploadFile
* 将要上传的文件
*/
public void uploadFile(String directory, String uploadFile) {
try {
// 打开channelSftp
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
// 远程连接
channelSftp.connect();
// 创建一个文件名称问uploadFile的文件
File file = new File(uploadFile);
// 将文件进行上传(sftp协议)
// 将本地文件名为src的文件上传到目标服务器,目标文件名为dst,若dst为目录,则目标文件名将与src文件名相同.
// 采用默认的传输模式:OVERWRITE
channelSftp.put(new FileInputStream(file), directory, ChannelSftp.OVERWRITE);
// 切断远程连接
channelSftp.exit();
System.out.println("2、" + file.getName() + " 文件上传成功.....");
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} } /**
* 下载文件 采用默认的传输模式:OVERWRITE
*
* @param src
* linux服务器文件地址
* @param dst
* 本地存放地址
* @throws JSchException
* @throws SftpException
*/
public void fileDownload(String src, String dst) throws JSchException, SftpException {
// src 是linux服务器文件地址,dst 本地存放地址
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
// 远程连接
channelSftp.connect();
// 下载文件,多个重载方法
channelSftp.get(src, dst);
// 切断远程连接,quit()等同于exit(),都是调用disconnect()
channelSftp.quit();
// channelSftp.disconnect();
System.out.println("3、" + src + " ,下载文件成功.....");
} /**
* 删除文件
*
* @param directory
* 要删除文件所在目录
* @param deleteFile
* 要删除的文件
* @param sftp
* @throws SftpException
* @throws JSchException
*/
public void deleteFile(String directoryFile) throws SftpException, JSchException {
// 打开openChannel的sftp
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
// 远程连接
channelSftp.connect();
// 删除文件
channelSftp.rm(directoryFile);
// 切断远程连接
channelSftp.exit();
System.out.println("4、" + directoryFile + " 删除的文件.....");
} /**
* 列出目录下的文件
*
* @param directory
* 要列出的目录
* @param sftp
* @return
* @throws SftpException
* @throws JSchException
*/
public Vector listFiles(String directory) throws JSchException, SftpException {
ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
// 远程连接
channelSftp.connect();
// 显示目录信息
Vector ls = channelSftp.ls(directory);
System.out.println("5、" + ls);
// 切断连接
channelSftp.exit();
return ls;
} public static void main(String[] args) {
// 连接到指定的服务器
try {
// 1、首先远程连接ssh
SSHRemoteCall.getInstance().sshRemoteCallLogin(ipAddress, userName, password);
// 打印信息
System.out.println("0、连接192.168.110.130,ip地址: " + ipAddress + ",账号: " + userName + ",连接成功....."); // 2、执行相关的命令
// 查看目录信息
// String command = "ls /home/hadoop/package ";
// 查看文件信息
// String command = "cat /home/hadoop/package/test ";
// 查看磁盘空间大小
// String command = "df -lh ";
// 查看cpu的使用情况
// String command = "top -bn 1 -i -c ";
// 查看内存的使用情况
String command = "free ";
SSHRemoteCall.getInstance().execCommand(command); // 3、上传文件
String directory = "/home/hadoop/package/poi.xlsx";// 目标文件名
String uploadFile = "E:\\poi.xlsx";// 本地文件名
SSHRemoteCall.getInstance().uploadFile(directory, uploadFile); // 4、下载文件
// src 是linux服务器文件地址,dst 本地存放地址,采用默认的传输模式:OVERWRITE
//test为文件名称哈
String src = "/home/hadoop/package/test";
String dst = "E:\\";
SSHRemoteCall.getInstance().fileDownload(src, dst); // 5、刪除文件
String deleteDirectoryFile = "/home/hadoop/package/test";
SSHRemoteCall.getInstance().deleteFile(deleteDirectoryFile); // 6、展示目录下的文件信息
String lsDirectory = "/home/hadoop/package";
SSHRemoteCall.getInstance().listFiles(lsDirectory); // 7、关闭连接
SSHRemoteCall.getInstance().closeSession();
} catch (Exception e) {
// 打印错误信息
System.err.println("远程连接失败......");
e.printStackTrace();
}
} }

运行效果如下所示:

、连接192.168.110.,ip地址: 192.168.110.130,账号: root,连接成功.....
、打印相关返回的命令: total used free shared buffers cachedMem: -/+ buffers/cache: 861372Swap:
、poi.xlsx 文件上传成功.....
、/home/hadoop/package/test ,下载文件成功.....
、/home/hadoop/package/test 删除的文件.....
、[drwxrwxrwx root root Oct : ., -rw-r--r-- root root Oct : poi.xlsx, drwx------ hadoop hadoop Oct : ..]

java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息的更多相关文章

  1. java操作FTP,实现文件上传下载删除操作

    上传文件到FTP服务器: /** * Description: 向FTP服务器上传文件 * @param url FTP服务器hostname * @param port FTP服务器端口,如果默认端 ...

  2. java nio 写一个完整的http服务器 支持文件上传 chunk传输 gzip 压缩 使用过程 和servlet差不多

    java nio 写一个完整的http服务器  支持文件上传   chunk传输    gzip 压缩      也仿照着 netty处理了NIO的空轮询BUG        本项目并不复杂 代码不多 ...

  3. linux CentOS 安装rz和sz命令 lrzsz 实现windows和linux之间的文件上传 下载

    https://blog.nbhao.org/1902.html https://bbs.csdn.net/topics/391989523 https://www.cnblogs.com/zhoul ...

  4. xftp实现本地与服务器的文件上传下载(windows)

    背景: Jemter环境搭建,需上传下载服务器文件到aws服务器上,由于secureCRT的局限性它只支持pub格式的密钥,不支持pem格式密钥,xshell是支持pem格式的,所以尝试安装xshel ...

  5. linux命令行模式下对FTP服务器进行文件上传下载

    参考源:点击这里查看   1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码 ...

  6. Linux服务器使用XShell上传下载文件

    在学习Linux过程中,我们常常需要将本地文件上传到Linux主机上,这里简单记录下使用Xsheel工具进行文件传输 1:首先连接上一台Linux主机 2:输入rz命令,看是否已经安装了lrzsz,如 ...

  7. java中TCP两个例子大写服务器和文件上传

    大写服务器的实例: package com.core.net; import java.io.BufferedReader; import java.io.BufferedWriter; import ...

  8. “通过jumpserver远程登录linux服务器,rz上传文件速度过慢”问题的解决

    问题: windows通过jumpserver远程登录到linux服务器,使用rz上传jar包,速度太慢(10k以内). 解决方案: 思路:通过ssh直接登录远程服务器 1.secureCRT-> ...

  9. mac 下配置连接Linux服务器方法,上传下载文件操作

    1.先按照文档在本地生成SSHkey 2.mac输入 sudo -i 进入超级管理员#模式下,然后 创建用户 #useradd XXXadmin #passwd XXXadmin XXXadmin用户 ...

随机推荐

  1. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  2. Nest + typeorm

    1\     Nest (https://nestjs.com/)  is a framework for building efficient, scalable Node.js web appli ...

  3. requests库入门04-http基本认证

    因为后续样例中GitHub都需要提供认证,所以先写关于基本认证的 http的请求中,有一些请求是需要通过授权认证之后才会响应,授权认证就是检查用户名和密码的过程.http有一个基本认证方式,在认证的过 ...

  4. CFtpFileFind例子

    #include <afx.h> #include <afxwin.h> #include <afxinet.h> #include <stdio.h> ...

  5. ASP.NET提供三种主要形式的缓存

    ASP.NET提供三种主要形式的缓存:页面级输出缓存.用户控件级输出缓存(或称为片段缓存)和缓存API.

  6. Linux命令之useradd和userdel(添加、删除用户)

    一.[useradd]:添加用户命令 1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s sh ...

  7. response.setContentType()的String参数及对应类型

    response.addHeader("Content-Disposition", "attachment;filename="+ filename); res ...

  8. HTML 页面meta标签

    1. 概述 1.1 说明 <meta>标签提供了HTML文档的元数据[元数据(Metadata)是数据的数据信息],即页面的元信息,元数据不会显示在客户端,但是会被浏览器解析.meta元素 ...

  9. 自然语言处理之关键词提取TF-IDF

    统计每篇文章重要的词作为这篇文章的关键词,用tf-idf来实现.生产中有很多第三包可以调用,这里记录原理,顺便熟练python 1.公式 : 计算词频TF 考虑到文章有长短之分,为了便于不同文章的比较 ...

  10. vi快速查找

    用vim时,想高亮显示一个单词并查找的方发,将光标移动到所找单词. 1: shift + "*"  向下查找并高亮显示 2: shift + "#"  向上查找 ...