sftp使用方法

这篇具有很好参考价值的文章主要介绍了sftp使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

要谈 sftpSSH File Transfer Protocol),首先要谈 ftpFile Transfer Protocol),大家都知道ftp是文件传输协议,它基于 tcp协议,可以用来发送文件。刚开始学web开发的时候,接触到一些免费的云空间,当时就是用的一个 ftp工具把项目传上去的。

定义:

sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

连接方法

windows中可以使用Core FTP,FileZilla, WinSCP, Xftp来连接SFTP进行上传,下载文件,建立,删除目录等操作。

linux下直接在终端中输入:sftp username@remote ip(or remote host name)。出现验证时,只需填入正确的密码即可实现远程链接。登入成功后终端呈现出:sftp>….

在sftp的环境下的操作就和一般ftp的操作类似了,ls,rm,mkdir,dir,pwd,等指令都是对远端进行操作,如果要对本地操作,只需在上述的指令上加‘l’变为:lls,lcd, lpwd等。当然既然是ftp,当然得说它的上传和下载咯!

上传:put /path/filename(本地主机) /path/filename(远端主机);

下载:get /path/filename(远端主机) /path/filename( 本地主机)。

另外提一下sftp在非正规端口(正规的是22号端口)登录:sftp -o port=1000 username@remote ip.

需要注意的是,用那个用户登陆就会登陆到那个用户的目录下,如用root登陆就是在/root 下,需要到哪个目录切换目录即可。比如要切换到 /home/wwwroot/lnmp.org 的网站目录下,直接在远程那边输入/home/wwwroot/lnmp.org 回车就切换过去了。

注意上传的文件的属主会设置为sftp登陆用户,如果要更改为www用户的话,需要在ssh里执行:chown www:www -R 网站目录 来更改属主和属组。

jsch简介

jsch是ssh的纯java实现。这么讲有点抽象,通俗说,你在官网上down下来就是一个jar包,引入你的项目,就可以用来给一个同样开启了ssh服务的服务器安全的传文件了(当然,你需要那台目标服务器的一些用户名和密码信息,不然就gg了)。

开始使用

  • 第一步:首先在maven中央仓库中查一下怎么在pom中依赖,可以点这里。

tip: 如果你用的是Gradle等其它构建工具,就用其他方式依赖进项目。如果没用构件工具,直接把jar包添加到项目里吧。

maven的是这个(我用的是当前最新版本0.1.54):

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

复制

加到pom文件中就可以进行下一步了。

  • 第二步:创建一个工具类:SFTPUtils.java, 内容如下
  • import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Properties;

/**
 * SFTP工具类
 * 包含两个方法:
 * 一个创建一个sftp通道对象,并返回这个对象,通过这 个对象可以直接发送文件。
 * 另一个是用于关闭回话和通道的。
 */
public class SFTPUtils {
  static private final Logger log = LoggerFactory.getLogger(SFTPUtils.class);

  static private Session session = null;
  static private Channel channel = null;
  static private int timeout = 60000; //超时数,一分钟

  /**
   * 传入一个通道对象
   * @param username 远程要连接的服务器的用户名
   * @param password 远程要连接的服务器的密码
   * @param ip 远程服务器ip
   * @param port 远程服务器的ssh服务端口
   * @return ChannelSftp返回指向这个通道指定的地址的channel实例
   * @throws JSchException
   */
  public static ChannelSftp getChannel(String username, String password, String ip, String port) throws JSchException {
    JSch jsch = new JSch(); // 创建JSch对象
    // 根据用户名,主机ip,端口获取一个Session对象
    session = jsch.getSession(username, ip, Integer.valueOf(aisle.getServerPort()));
    log.info("Session created...");
    if (password != null) {
      session.setPassword(password); // 设置密码
    }
    Properties config = new Properties();
    config.put("StrictHostKeyChecking", "no");
    session.setConfig(config); // 为Session对象设置properties
    session.setTimeout(timeout); // 设置timeout时间
    session.connect(); // 通过Session建立链接
    log.info("Session connected, Opening Channel...");
    channel = session.openChannel("sftp"); // 打开SFTP通道
    channel.connect(); // 建立SFTP通道的连接
    log.info("Connected successfully to ip :{}, ftpUsername is :{}, return :{}",
        ip,username, channel);
    return (ChannelSftp) channel;
  }

  /**
   * 关闭channel和session
   * @throws Exception
   */
  public static void closeChannel() throws Exception {
    if (channel != null) {
      channel.disconnect();
    }
    if (session != null) {
      session.disconnect();
    }
  }
}

复制

  • 第三步:工具类都建好了,就直接用吧——创建测试类。
import com.gildata.gup.util.SFTPUtils;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.FileInputStream;
import java.util.Vector;
/**
* sftp推送测试类
*/
@Service
public class SftpTest {
private final Logger log = LoggerFactory.getLogger(SftpPushTest.class);
/**
* 文件推送的测试方法。
* destDirPath 远程服务器要保存的文件夹路径
* file  本地要推送的文件对象
* username 远程服务器的用户名
* password  远程服务器的密码
* ip  远程服务器ip
* port 远程服务器ssh服务端口
*/
public void testSftp() throws SftpException {
// 假设参数值
String dstDirPath = "E:\\target";
String username = "admin";
String password = "admin";
String ip = "127.0.0.1"; 
String port = 21; 
ChannelSftp channelSftp = null;
String dstFilePath; // 目标文件名(带路径),如: D:\\file\\file.doc,这个路径应该是远程目标服务器下要保存的路径
try {
// 一、 获取channelSftp对象
channelSftp = SFTPUtils.getChannel(username, password, ip, port);
// 二、 判断远程路径dstDirPath是否存在(通道配置的路径)
try {
Vector dir = channelSftp.ls(dstDirPath);
if (dir == null) { // 如果路径不存在,则创建
channelSftp.mkdir(dstDirPath);
}
} catch (SftpException e) { // 如果dstDirPath不存在,则会报错,此时捕获异常并创建dstDirPath路径
channelSftp.mkdir(dstDirPath); // 此时创建路o如果再报错,即创建失败,则抛出异常
e.printStackTrace();
}
// 三、 推送文件
try {
log.info("send the file : {}", file.getName());
dstFilePath = dstDirPath + "\\" + file.getName();
log.info("the file all path is :{}", dstFilePath);
// 推送: dstFilePath——传送过去的文件路径(全路径),采用默认的覆盖式推送
channelSftp.put(new FileInputStream(file), dstFilePath); // jsch触发推送操作的方法
}  catch (SftpException e) {
log.debug("An error occurred during sftp push, send data fail, the target path is :{}", dstDirPath);
if (log.isDebugEnabled()) {
e.printStackTrace();
}
}
}  finally {
// 处理后事
if (channelSftp != null)
channelSftp.quit();
try {
SFTPUtils.closeChannel();
} catch (Exception e) {
if (log.isDebugEnabled())
e.printStackTrace();
}
}
}
}

复制

执行testSftp方法,就可以把file文件传到目标服务器的dstDirPath目录下了。

假设file文件在本地的路径为: D:\\source\\sftp_learning.ppt。而目标路径dstDirPath为: E:\\target,那么执行推送后,将会在ip为ip的远程设备下的E:\\target目录下找到sftp_learning.ppt文件。

问题?!

不过遗憾的是,window并不像linux一样自带了ssh服务。像上面的E:\\target这样的目录显然表明了这个远程设备是window系统。正常开发中,即使你的用户名、 密码、 端口都没有输错,程序也将会抛SftpException异常,那是因为你得目标服务器没有启用ssh服务。

怎么解决呢?

既然目标服务器是没有自带ssh服务的window,那就想办法在window下配置ssh服务咯。

一般而言,服务器通常跑在linux下,所以不用担心这个问题。笔者这次也是因为想在自己的window下本地测试一下,所以遇到了这个问题。如何在window下配置ssh服务,这又是另一个话题了。这次测试中,我用的是Cygwin工具。具体怎么使用,网上一搜一大把。如果读着支持笔者,就请关注我吧,我会尽快把Cygwin的使用心得分享给大家的!文章来源地址https://www.toymoban.com/news/detail-627698.html

到了这里,关于sftp使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA使用SFTP和FTP两种方式连接服务器

    FTP是一种文件传输协议,一般是为了方便数据共享的。包括一个FTP服务器和多个FTP客户端。FTP客户端通过FTP协议在服务器上下载资源。FTP客户端通过FTP协议在服务器上下载资源。而一般要使用FTP需要在服务器上安装FTP服务。 而SFTP协议是在FTP的基础上对数据进行加密,使得传

    2024年02月14日
    浏览(46)
  • 使用代理之后,电脑浏览器连接不上网络的解决方法

    目录 一、解决方法 1、internet 选项 2.局域网设置关掉所有能勾选的选项(尤其是为LAN使用代理服务器) 二、原因 开启vpn的时候这个代理服务器就会打开,当电脑关机时没来得及关闭vpn时这个代理服务器的选项就会没来得及关上。当你再次关机时,vpn没有开启,但是却开启了

    2024年02月11日
    浏览(58)
  • 使用Linux远程连接OpenGauss数据库的步骤和方法

    openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性. 结合cpolar 内网穿透工具,即可实现远程访问本地openGauss,实现远程访问,下面介绍从Linux安装到远程访问的方式

    2024年02月07日
    浏览(42)
  • 【Charles】成功解决使用iOS手机抓包时,iOS手机连接网络失败&Charles配置方法

    解决方法:原来是因为我换了一台电脑,需要重新安装手机的证书,不能用之前的证书。而且安装完证书以后,Charles没有弹出让我allow的窗口,就直接可以抓包了。 配置方法如下,搬运自同事大佬: 手机和电脑连接同一个网络,启动charles工具 iOS手机代理配置,服务器及端口

    2024年02月11日
    浏览(58)
  • Linux环境下SVN服务器的搭建与公网访问:使用cpolar端口映射的实现方法

    由于文档资料越来越多,将所有资料都存放在自己的电脑上容易混淆,并且也不利于分享。这种情况下,考虑将资料上传SVN统一管理,这样一来其他人也能很方便的查略各种资料。 当SVN安装在局域网内的话,想要远程访问资料库或者代码将会受到限制,为了能从公共网络访问内

    2024年02月11日
    浏览(64)
  • 如何在 Linux 服务器上安装和使用 SFTP?

    SFTP 或 SSH 文件传输协议是一种在两台计算机之间安全传输数据的方法。它是运行在 SSH 协议之上并利用其安全性并完全支持其身份验证的 FTP。 现在,建议使用 SFTP 而不是旧的旧 FTP 或 FTP/S 协议。SFTP 默认是安全的,因为这就是 SSH 的工作方式。从安全的角度来看,SFTP 还可以

    2024年02月11日
    浏览(47)
  • io使用率高运行堵塞怎么解决?linux系统由io使用率高引起的运行堵塞的解决方法

    1.在宝塔查看服务器负载100%,而cpu和内存使用率都正常 输入top命令查看平均负载:

    2024年02月15日
    浏览(42)
  • Windows 11 首次开机OOBE阶段跳过连接网络及登录微软账户,使用本地账号登录的方法

    2022/11/25更新: 以下方法最新版本的Win11 22H1上已失效,最新的方法是在第二步呼出cmd窗口,输入 oobebypassnro ,电脑会重启,再次来到连接网络的页面时选择“我没有Internet连接”的选项,就可以跳过联网了。 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

    2024年01月17日
    浏览(47)
  • SSH连接SFTP传输:如何使用libssh库在windows环境下进行(文件、文件夹)传输到远端服务器

    由于windows上的编译器一般都是没有libssh库的,所以如何我们想要使用libssh库那么我们将会使用cmake来编译libssh官网给出的源代码 libssh库下载地址: https://www.libssh.org/files/ 我们在编译libssh库之前需要先配置一些环境: a) 安装 Visual Studio 或者 MinGW b) 安装OpenSSL http://slproweb.com/p

    2024年04月24日
    浏览(68)
  • linux在非联网、无网络环境下,使用yumdownload、reportrack方法安装rpm包

    当开发者在联网环境下使用Linux时,可以轻松地通过yum或apt-get安装软件。然而,在公司和企业中,由于安全原因,生产环境通常无法访问互联网,这就需要进行离线安装。离线安装有两种主要方式可选: 源码编译:源码编译耗时且需要合适的编译环境,因此一般情况下较少选

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包