Java连接远程主机的方式有多种,这里和大家分享的是通过ssh方式连接远程主机,使用的是jsch这个jar包,资源在这里。
不懂ssh为何物的朋友可以从网上找找相关资料,这里只简单的解释下:SSH 为 Secure Shell(安全外壳协议) 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定,为建立在应用层和传输层基础上的安全协议。SSH在传输层提供服务器认证,数据机密性,信息完整性等的支持,并为服务器提供客户端的身份鉴别。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
下面是自己写的一个sftp帮助类,代码中有错误或者是不合理完善的地方希望能够指出,共同学习成长:
package com.app.pt.backup.util; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.app.common.util.FileUtil; import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.ChannelSftp.LsEntry; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; /** * SFTP帮助类 * @author wangbailin * */ public class SFTPUtil { private static Log log = LogFactory.getLog(SFTPUtil.class); /** * 连接sftp服务器 * @param host 远程主机ip地址 * @param port sftp连接端口,null 时为默认端口 * @param user 用户名 * @param password 密码 * @return * @throws JSchException */ public static Session connect(String host, Integer port, String user, String password) throws JSchException{ Session session = null; try { JSch jsch = new JSch(); if(port != null){ session = jsch.getSession(user, host, port.intValue()); }else{ session = jsch.getSession(user, host); } session.setPassword(password); //设置第一次登陆的时候提示,可选值:(ask | yes | no) session.setConfig("StrictHostKeyChecking", "no"); //30秒连接超时 session.connect(30000); } catch (JSchException e) { e.printStackTrace(); System.out.println("SFTPUitl 获取连接发生错误"); throw e; } return session; } /** * sftp上传文件(夹) * @param directory * @param uploadFile * @param sftp * @throws Exception */ public static void upload(String directory, String uploadFile, ChannelSftp sftp) throws Exception{ System.out.println("sftp upload file [directory] : "+directory); System.out.println("sftp upload file [uploadFile] : "+ uploadFile); File file = new File(uploadFile); if(file.exists()){ //这里有点投机取巧,因为ChannelSftp无法去判读远程linux主机的文件路径,无奈之举 try { Vector content = sftp.ls(directory); if(content == null){ sftp.mkdir(directory); } } catch (SftpException e) { sftp.mkdir(directory); } //进入目标路径 sftp.cd(directory); if(file.isFile()){ InputStream ins = new FileInputStream(file); //中文名称的 sftp.put(ins, new String(file.getName().getBytes(),"UTF-8")); //sftp.setFilenameEncoding("UTF-8"); }else{ File[] files = file.listFiles(); for (File file2 : files) { String dir = file2.getAbsolutePath(); if(file2.isDirectory()){ String str = dir.substring(dir.lastIndexOf(file2.separator)); directory = FileUtil.normalize(directory + str); } upload(directory,dir,sftp); } } } } /** * sftp下载文件(夹) * @param directory 下载文件上级目录 * @param srcFile 下载文件完全路径 * @param saveFile 保存文件路径 * @param sftp ChannelSftp * @throws UnsupportedEncodingException */ public static void download(String directory,String srcFile, String saveFile, ChannelSftp sftp) throws UnsupportedEncodingException { Vector conts = null; try{ conts = sftp.ls(srcFile); } catch (SftpException e) { e.printStackTrace(); log.debug("ChannelSftp sftp罗列文件发生错误",e); } File file = new File(saveFile); if(!file.exists()) file.mkdir(); //文件 if(srcFile.indexOf(".") > -1){ try { sftp.get(srcFile, saveFile); } catch (SftpException e) { e.printStackTrace(); log.debug("ChannelSftp sftp下载文件发生错误",e); } }else{ //文件夹(路径) for (Iterator iterator = conts.iterator(); iterator.hasNext();) { LsEntry obj = (LsEntry) iterator.next(); String filename = new String(obj.getFilename().getBytes(),"UTF-8"); if(!(filename.indexOf(".") > -1)){ directory = FileUtil.normalize(directory + System.getProperty("file.separator") + filename); srcFile = directory; saveFile = FileUtil.normalize(saveFile + System.getProperty("file.separator") + filename); }else{ //扫描到文件名为".."这样的直接跳过 String[] arrs = filename.split("\\."); if((arrs.length > 0) && (arrs[0].length() > 0)){ srcFile = FileUtil.normalize(directory + System.getProperty("file.separator") + filename); }else{ continue; } } download(directory, srcFile, saveFile, sftp); } } } }
使用sftp帮助类上传或下载:
ChannelSftp sftp = null; Session session = null; try { session = SFTPUtil.connect(host, port, username, password); Channel channel = session.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; SFTPUtil.upload(destDir, srcfile.getAbsolutePath(), sftp); } catch (Exception e) { e.printStackTrace(); logger.debug(e); return UtilMisc.toMap("flag","failure","msg","备份文件到远程主机发生错误"); }finally{ if(sftp != null)sftp.disconnect(); if(session != null)session.disconnect(); }
(转自:http://blog.csdn.net/wangbailin2009/article/details/20232999)
相关推荐
总之,Java通过SSH连接远程主机并读取文件是通过第三方库实现的,`ganymed-ssh2`提供了强大的功能和灵活性。理解和掌握这些技术对于开发涉及远程文件操作的应用至关重要。在实际开发中,需要结合具体需求,灵活运用...
Telnet是一种协议,允许用户通过网络在远程主机上执行命令。在Java中,我们可以使用`java.net.Socket`类来建立TCP连接,然后通过输入/输出流来发送和接收数据。以下是一个简单的Telnet连接示例: ```java import...
jsch通过java代码ssh登录主机远程执行命令并返回结果。注意,这个是源代码,请自行编译后在使用。当然,也可以根据自己的需要更改源代码。
本篇文章将深入探讨如何使用Java通过SSH和FTP协议来实现从服务器下载文件到本地的操作。 首先,对于SSH连接,Java中通常使用JSch库。JSch是一个纯Java实现的SSH2库,它可以让你连接到一个SSH服务器,执行命令,以及...
SSH(Secure Shell)是一种网络协议,用于在不安全的...通过以上步骤,你可以使用Java的SSH2框架(如JSch)连接到远程服务器,执行命令和传输文件。这在自动化运维、远程脚本执行、文件同步等多个场景中都非常实用。
在IT行业中,Java远程连接SSH是一项重要的技能,特别是在管理和维护基于Linux系统的服务器时。SSH(Secure Shell)是一种网络协议,用于安全地远程控制操作系统,执行命令,传输数据。本篇文章将详细探讨Java如何...
Java SSH框架,如JSch或Apache MINA,允许开发者在Java应用中实现SSH功能,包括文件的上传和下载。这里我们将深入探讨如何使用这些框架进行SSH文件传输,以及涉及的相关知识点。 首先,SSH框架在Java中的应用主要...
在这个场景中,"ssh文件上传下载"指的是通过SSH协议在本地计算机和远程服务器之间进行文件的传输。 1. **SSH基础** SSH是Secure Shell的缩写,由IETF的网络工作小组制定。它为网络服务提供了安全的加密通信渠道,...
SFTP(SSH File Transfer Protocol)是一种安全文件传输协议,它为文件传输提供了安全加密的方式。与传统FTP协议相比,SFTP能够对认证信息和传输数据进行加密处理,从而保障数据传输过程的安全性。由于采用了加密/...
Linux远程连接工具类SSH是一种广泛使用的通信协议,它允许用户在本地计算机上安全地操作远程Linux系统。SSH,全称为Secure Shell,旨在提供加密的网络服务,特别适用于管理服务器、执行命令、传输文件等场景。在开发...
在Java开发中,SSH通常指的是使用Java实现的SSH连接库,如JSch,它允许程序员通过Java代码来实现SSH连接到远程服务器,进行文件传输、命令执行等操作。 本工程名为"SSH连接远程服务器的一个简单的工程",它提供了...
SSH(Secure Shell)协议是一种网络协议,用于在不安全的网络上安全地远程访问和管理服务器。Java中的JSCH库(JSch)是实现SSH连接的开源库,它提供了全面的功能,包括SFTP(SSH File Transfer Protocol)、SCP...
这里,我们将会详细探讨Java如何通过SSH连接到Linux系统以及相关的关键概念和技术。 首先,SSH是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。它通过加密来保护数据传输,防止中间人攻击。在...
在这个场景中,"SSH连接数据库所需jar"指的是使用Java编程语言通过SSH隧道连接到数据库所需的Java类库(JAR文件)。 SSH连接数据库的方式通常是通过建立一个SSH隧道,将本地端口映射到远程服务器上的某个端口,从而...
本篇文章将深入探讨如何使用Java连接服务器,执行命令,进行文件上传和下载,并结合Sigar库来获取系统信息。 一、Java连接服务器与执行命令 在Java中,我们可以使用JSch库来实现SSH(Secure Shell)连接,从而远程...
Java使用JSCH(Java Secure Channel)库连接远程服务器是一个常见的任务,特别是在自动化运维、文件传输或者执行远程命令等场景中。JSCH是一个纯Java实现的SSH2库,它提供了连接到支持SSH协议的服务器的能力,如...
5. **SSH连接设置**:除了数据库连接信息,还需要SSH的凭据,包括SSH服务器的主机名、端口、用户名和私钥文件(如果使用公钥认证)。 6. **代码实现**:在Java程序中,使用JSch库创建SSH隧道,然后通过隧道建立到...
SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。在IT领域,SSH常用于文件的传输,包括上传和下载。...通过学习和实践,我们可以更加熟练地使用SSH进行文件的上传和下载。
在IT领域,尤其是在大数据处理和分布式计算中,Java和SSH(Secure Shell)是两种非常重要的技术。...开发者可以通过Java API直接操作HDFS,利用SSH进行远程管理和监控,实现高效且安全的文件操作和结果查询。
- **文件传输**:使用SFTP(SSH File Transfer Protocol)进行文件的上传和下载。 - **多命令脚本**:通过SSH执行一系列命令,可能需要自定义命令的分隔符和逻辑。 - **错误处理**:处理网络中断、权限问题或其他...