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. python3+selenium入门05-元素操作及常用方法

    学习了元素定位之后,来看一些元素的操作,还有一些常用的方法 clear()清空输入框内容 click()点击 send_keys()键盘输入 import time from selenium imp ...

  2. CLR via C# 中关于装箱拆箱的摘录

     装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ...

  3. NOIP提高组—— 问题求解 与 完善程序

    问题求解1: 甲乙丙丁四人在考虑周末要不要外出郊游. 已知①如果周末下雨,并且乙不去,则甲一定不去:②如果乙去,则丁一定去:③如果丙去,则丁一定不去:④如果丁不去,而且甲不去,则丙一定不去.如果周末丙 ...

  4. office xml 方式

    office2007以上版本(2003需要增加2007插件)可以采用xml方式操作生成excel,效率高,无并发问题,比传统com组件方式更方便

  5. Fiddler模拟低速网络

    1. 打开 Rules -> Customize Rules,ctrl + F 找 300 2.修改上传.下载速度,保存 ctrl + s 3.启动模拟网络限速 4.想要取消模拟网络限速,取消勾 ...

  6. Laravel 5.2 错误-----ReflectionException in compiled.php line 8572: Class App\Http\Controllers\Apih5\ZhaoshangController does not exist

    测试的时候,报错了!想不到找了半天的问题,居然是个低级错误. <?php namespace App\Http\Controllers\Apih5; use Illuminate\Http\Re ...

  7. Django 2.x 常用命令

    从Pycharm换成VsCode,好多命令都不会,这里记一下. 创建 Django 项目 先进入到你想要创建 project 目录下,执行命令 django-admin startproject pr ...

  8. python-并发编程之多进程

    一.操作系统基础: 进程的概念起源于操作系统,操作系统其它所有概念都是围绕进程来的,所以我们了解进程之前先来了解一下操作系统 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统 ...

  9. flex下部固定高,上部不固定,而且超过内容要滚动

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  10. textarea的高度随内容变化而变化

    <li class="text"> <span>参赛宣言*</span> <textarea name="txt" i ...