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. shell-自动按省市建立文件夹,并在每个城市下创建当前日期文件夹

    Code: #!/bin/bash date=`date +%Y%m%d` ProName="广东市" CityName="广州市 汕尾市 阳江市 揭阳市 茂名市 江门市 ...

  2. js学习笔记--dom部分(一)

    js 学习整理之Dom部分 前面我总结了我最近学习js基础部分,当时提到过js分了三大部分,第一部分ECMA基础也就是第一次写的基础部分, 第二部分也就是DOM部分,也就是这里要写的内容的,然后第三部 ...

  3. linux中bashrc与profile的区别

    bashrc与profile的区别 要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是login shell 和non-login shell. ...

  4. Vue 核心之数据劫持

    前端界空前繁荣,各种框架横空出世,包括各类mvvm框架横行霸道,比如Angular.Regular.Vue.React等等,它们最大的优点就是可以实现数据绑定,再也不需要手动进行DOM操作了,它们实现 ...

  5. OpenCV中RGB和HSV转换的问题

    1.一般情况下HSV模型各分量的取值范围为:H为0到360°,S为0到100%,V为0到255.但是在OpenCV中在由RGB转换到HSV的过程中,发现HSV中H为0到180°,S为0到255,V为0 ...

  6. LabVIEW--为控件添加说明信息

    之前只知道为VI添加说明信息(在VI的属性里面添加,快捷键ctrl+I 打开),今天知道了控件也可以添加说明信息,这样就方便了许多,极大的提高了程序的可读性.

  7. spring mvc数据绑定与表单标签库

    Book类为 package org.shaoxiu; public class Book { private String id; private String name; public Book( ...

  8. Appium新版本不再支持ByName定位了怎么办

    appium版本在1.5以后就不再支持ByName的定位,本文章仅介绍在appium1.6.3/1.6.4/1.6.5版本下如何支持ByName定位,适用于安卓.在使用appium1.5之后的版本时, ...

  9. 通过dd命令显示硬盘的读写性能

    测试vdb硬盘的读写速度 1.分区格式化挂载vdb硬盘 2.新建写入文件2 3.测试:文件2中写入数据,设置块大小为100M,拷贝块个数为5 经过测试:测试效果一般count越高越准确,建议为300, ...

  10. 密码正确 mysql无法登陆 red7.3 上安装mysql5.6后登录报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passswd :yes)

    集群需要mysql存储元数据,就在前几天还运行好好的,突然就进不去了......还是太菜,遇到的bug少. 引起这种故障的原因有很多......第一个坑比较多,大部分用户也就用第一个就可以解决问题,我 ...