Java通过ssh向服务器上传下载删除文件和操作Linux

简介: Java通过ssh向服务器上传下载删除文件和操作Linux

1 JSch介绍

JSch是SSH2的纯Java实现 。JSch允许您连接到sshd服务器并使用端口转发,X11转发,文件传输等,您可以将其功能集成到您自己的Java程序中。本文主要介绍利用JSch实现sftp通过ssh上传下载文件和一些相关配置。

2 编码使用

2.1 JSch的引用

1)项目中导入jsch-0.1.53.jar包


下载地址:https://sourceforge.net/projects/jsch/files/jsch/0.1.53/jsch-0.1.53.zip/download


2)Maven中引用的pom.xml配置

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

gradle: compile group: 'com.jcraft', name: 'jsch', version: '0.1.53'

2.2 JSch连接配置代码

public class SFTP{
    private Session session;//会话 
    private Channel channel;//连接通道 
    private ChannelSftp sftp;// sftp操作类 
    public Session getSession() {
        return session;
    }
    public void setSession(Session session) {
        this.session = session;
    }
    public Channel getChannel() {
        return channel;
    }
    public void setChannel(Channel channel) {
        this.channel = channel;
    }
    public ChannelSftp getSftp() {
        return sftp;
    }
    public void setSftp(ChannelSftp sftp) {
        this.sftp = sftp;
    }
}
public static void getConnect(SFTP s) throws Exception {
                /** 密钥的密码  */ 
//      String privateKey ="key";
//        /** 密钥文件路径  */ 
//      String passphrase ="path";
        /** 主机 */ 
        String host ="127.0.0.1"; 
        /** 端口 */ 
        int port =22; 
        /** 用户名 */ 
        String username ="test";
        /** 密码 */ 
        String password ="test";
        Session session = null;   
        Channel channel = null;   
        ChannelSftp sftp = null;// sftp操作类  
        JSch jsch = new JSch();   
        //设置密钥和密码  
        //支持密钥的方式登陆,只需在jsch.getSession之前设置一下密钥的相关信息 
//      if (privateKey != null && !"".equals(privateKey)) {  
//             if (passphrase != null && "".equals(passphrase)) {  
//              //设置带口令的密钥  
//                 jsch.addIdentity(privateKey, passphrase);  
//             } else {  
//              //设置不带口令的密钥  
//                 jsch.addIdentity(privateKey);  
//             }  
//      }  
        session = jsch.getSession(username, host, port);   
        session.setPassword(password);   
        Properties config = new Properties();   
        config.put("StrictHostKeyChecking", "no"); // 不验证 HostKey    
        session.setConfig(config);   
        try {
            session.connect();   
        } catch (Exception e) {
            if (session.isConnected())   
                session.disconnect();   
        }
        channel = session.openChannel("sftp");   
        try {
            channel.connect();   
        } catch (Exception e) {   
            if (channel.isConnected())   
                channel.disconnect();   
        }
        sftp = (ChannelSftp) channel;   
        s.setChannel(channel);
        s.setSession(session);
        s.setSftp(sftp);
    }
/*断开连接*/
  public static void disConn(Session session,Channel channel,ChannelSftp sftp)throws Exception{
        if(null != sftp){
            sftp.disconnect();
            sftp.exit();
            sftp = null;
        }
        if(null != channel){
            channel.disconnect();
            channel = null;
        }
        if(null != session){
            session.disconnect();
            session = null;
        }
    }

2.3 使用JSch上传下载删除文件代码

1)上传文件代码

  /**
     * 上传文件
     * @param directory 上传的目录-相对于SFPT设置的用户访问目录,
     * 为空则在SFTP设置的根目录进行创建文件(除设置了服务器全磁盘访问)
     */
    public static void upload(String directory,InputStream in,String name) throws Exception {
        SFTP s=new SFTP();
        getConnect(s);//建立连接
        Session session = s.getSession();
        Channel channel = s.getChannel();
        ChannelSftp sftp = s.getSftp();// sftp操作类
            try{
                sftp.cd(directory); //进入目录
            }catch(SftpException sException){
                if(sftp.SSH_FX_NO_SUCH_FILE == sException.id){ //指定上传路径不存在
                    sftp.mkdir(directory);//创建目录
                    sftp.cd(directory);  //进入目录
                }
            }
        sftp.put(in, name);
        in.close();
        disConn(session,channel,sftp);
    }

2)下载文件代码

/**
     * 下载文件
     * @param directory 下载目录 根据SFTP设置的根目录来进行传入
     * @param downloadFile  下载的文件 
     * @param saveFile  存在本地的路径 
     */
    public static void download(String directory, String downloadFile,String saveFile) throws Exception {
        SFTP s=new SFTP();
        getConnect(s);//建立连接
        Session session = s.getSession();   
        Channel channel = s.getChannel();   
        ChannelSftp sftp = s.getSftp();// sftp操作类  
        try {
            sftp.cd(directory); //进入目录
            File file = new File(saveFile);
            boolean bFile;
            bFile = false;
            bFile = file.exists();
            if (!bFile) {
                bFile = file.mkdirs();//创建目录
            }
            OutputStream out=new FileOutputStream(new File(saveFile,downloadFile));
            sftp.get(downloadFile, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            throw new Exception(e.getMessage(),e); 
        } finally {
            disConn(session,channel,sftp);
        }
    }

3)删除文件代码

/**
     * 删除文件
     * @param directory 要删除文件所在目录 
     * @param deleteFile 要删除的文件
     */
    public static void delete(String directory, String deleteFile) throws Exception {
        SFTP s=new SFTP();
        getConnect(s);//建立连接
        Session session = s.getSession();   
        Channel channel = s.getChannel();   
        ChannelSftp sftp = s.getSftp();// sftp操作类  
        try {
            sftp.cd(directory); //要删除的目录的上一级
            sftp.rm(deleteFile);//删除目录
        } catch (Exception e) {
            throw new Exception(e.getMessage(),e); 
        } finally {
            disConn(session,channel,sftp);
        }
    }

2.4 拓展功能java使用命令操作linux

#添加用户
useradd -d /home/test -m fgb
#-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
创建fgb用户  指定主目录为/home/test
#修改用户密码
 echo password | passwd --stdin username
示例:把root用户的密码修改成123456
 echo "123456" | passwd --stdin root
#删除用户
userdel -r username
示例:把fgb用户删除
userdel -r fgb
#给用户赋予某个文件夹权限
chown 700 fgb /usr/local/test
给fgb用户赋予/usr/local/test目录700权限

首先pom文件导入依赖

<dependency>
  <groupId>ch.ethz.ganymed</groupId>
  <artifactId>ganymed-ssh2</artifactId>
  <version>262</version>
</dependency>

工具类

public class SshBasic{
    //连接,登陆
    public Connection login(String hostname,int port,String username,String password){
        //获取连接
        Connection conn = new Connection(hostname, port);
        try {
            //连接
            conn.connect();
            //输入账号密码登陆
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);
            //登陆失败,返回错误
            if(isAuthenticated == false){
                throw new IOException("isAuthentication failed.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return conn;
    }
    //获取Session
    public Session getSession(Connection conn){
        Session sess = null;
        try {
            sess = conn.openSession();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return sess;
    }
   }

代码调用

    public static void main(String[] args) {
        SshBasic m = new SshBasic();
        //连接并登陆
        Connection conn = m.login("132.122.1.51", 22, "srglweb", "srglweb123");
        //获取Session
        Session sess = m.getSession(conn);
        //执行命令    下面命令是删除用户fgb
        try{
          sess.execCommand("userdel -r fgb")
        }catch(IOException e){
          e.printStackTrace();
        }
        //判断会话是否成功
        int result = sess.getExitStatus();//如果成功返回0
        System.out.println("result:"+result);
        //释放资源  
        sess.close();
        conn.close();
    }
} 


目录
相关文章
|
弹性计算 安全 Linux
阿里云服务器ECS安装宝塔Linux面板、安装网站(新手图文教程)
本教程详解如何在阿里云服务器上安装宝塔Linux面板,涵盖ECS服务器手动安装步骤,包括系统准备、远程连接、安装命令执行、端口开放及LNMP环境部署,手把手引导用户快速搭建网站环境。
|
Java Linux 定位技术
Minecraft配置文件参数说明(JAVA服务器篇)
Minecraft JAVA版服务器启动后会生成server.properties配置文件,位于minecraft_server/根目录下。该文件包含多项关键设置,如游戏模式(gamemode)、最大玩家数(max-players)、难度(difficulty)等。此文档详细说明了各配置项的功能与默认值,帮助用户高效管理服务器环境。
5182 62
|
监控 Linux 网络安全
FinalShell SSH工具下载,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux
FinalShell是一款国人开发的多平台SSH客户端工具,支持Windows、Mac OS X和Linux系统。它提供一体化服务器管理功能,支持shell和sftp同屏显示,命令自动提示,操作便捷。软件还具备加速功能,提升访问服务器速度,适合普通用户和专业人士使用。
4056 0
|
数据挖掘 Linux 数据库
服务器数据恢复—Linux系统服务器数据恢复案例
服务器数据恢复环境: linux操作系统服务器中有一组由4块SAS接口硬盘组建的raid5阵列。 服务器故障: 服务器工作过程中突然崩溃。管理员将服务器操作系统进行了重装。 用户方需要恢复服务器中的数据库、办公文档、代码文件等。
|
JavaScript Linux Python
在Linux服务器中遇到的立即重启后的绑定错误:地址已被使用问题解决
总的来说,解决"地址已被使用"的问题需要理解Linux的网络资源管理机制,选择合适的套接字选项,以及合适的时间点进行服务重启。以上就是对“立即重启后的绑定错误:地址已被使用问题”的全面解答。希望可以帮你解决问题。
783 20
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
存储 运维 监控
深度体验阿里云系统控制台:SysOM 让 Linux 服务器监控变得如此简单
作为一名经历过无数个凌晨三点被服务器报警电话惊醒的运维工程师,我对监控工具有着近乎苛刻的要求。记得去年那次大型活动,我们的主站流量暴增,服务器内存莫名其妙地飙升到90%以上,却找不到原因。如果当时有一款像阿里云 SysOM 这样直观的监控工具,也许我就不用熬通宵排查问题了。今天,我想分享一下我使用 SysOM 的亲身体验,特别是它那令人印象深刻的内存诊断功能。
854 1
|
Linux 虚拟化 Docker
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
2756 1
|
安全 大数据 Linux
云上体验最佳的服务器操作系统 - Alibaba Cloud Linux | 飞天技术沙龙-CentOS 迁移替换专场
本次方案的主题是云上体验最佳的服务器操作系统 - Alibaba Cloud Linux ,从 Alibaba Cloud Linux 的产生背景、产品优势以及云上用户使用它享受的技术红利等方面详细进行了介绍。同时,通过国内某社交平台、某快递企业、某手机客户大数据业务 3 大案例,成功助力客户实现弹性扩容能力提升、性能提升、降本增效。 1. 背景介绍 2. 产品介绍 3. 案例分享
606 1
|
Java Spring Web App开发
JAVA SSH 框架介绍
SSH 为 struts+spring+hibernate 的一个集成框架,是目前较流行的一种JAVA Web应用程序开源框架。 Struts Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。
2498 0