sftp与ftp的区别与联系

来源:互联网 发布:购买域名后如何使用 编辑:程序博客网 时间:2024/05/17 23:38

 SFTP简介

        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。

1、连接方法

          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.

2、缩写来源 

SFTP (S/FTP)是Screened Fully shielded Twisted Pair (筛选全屏蔽双绞线)的缩写。[1]这是一个特殊类型的电缆,使用金属屏蔽以阻止外界的干扰。它集成了其他几个电缆所采用的方法,以达到对电缆最大程度的保护。

3、sftp的使用命令

      sftp 是一个交互式文件传输程式。它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性。下边就简单介绍一下如何远程连接主机,进行文件的上传和下载,以及一些相关操作。

举例,如远程主机的 IP 是 192.168.10.163或者是域名www.server.cn,用户名是 lx,在命令行模式下:sftp lx@192.168.10.163或者  lx@www.server.cn。回车提示输入密码。进入提示符

sftp>

如果登陆远程机器不是为了上传下载文件,而是要修改远程主机上的某些文件。可以

ssh  lx@192.168.10.163 (其实sftp就是ssh 的一个程式。)

sftp> get /var/index.php  /home/lx/
这条语句将从远程主机的 /var/目录下将 index.php 下载到本地  /home/lx目录下。

sftp> put /home/lx/downloads/linux.pdf /var/lx/
这条语句将把本地 /home/lx/downloads/目录下的 linux.pdf文件上传至远程主机/var/lx/ 目录下。

你如果不知道远程主机的目录是什么样, pwd命令可以帮你查询远程主机的当前路径;查询本机当前工作目录 lpwd 。

4、java代码实现sftp服务器的登陆连接,注销登录,上传、下载、删除文件

 附带:所需jar依赖配置

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

--------------------------------------------------------------

/**
     * 连接sftp服务器
     *
     * @param host  主机
     * @param port  端口
     * @param username 用户名
     * @param password 密码
     * @return
     */
    public static ChannelSftp connect(String host, int port, String username, String password) {
        ChannelSftp sftp = null;
        try {
            JSch jsch = new JSch();
            jsch.getSession(username, host, port);
            Session sshSession = jsch.getSession(username, host, port);
            logger.debug("Session created.");
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            logger.debug("Session connected.");
            logger.debug("Opening Channel.");
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
            logger.debug("Connected to " + host + ".");
        } catch (Exception e) {

        }
        return sftp;
    }

    /**
     * 上传文件
     *
     * @param directory 上传的目录
     * @param uploadFile 要上传的文件
     * @param sftp
     */
    public static void upload(String directory, String uploadFile, ChannelSftp sftp) {
        createDir(directory, sftp);
        File file = new File(uploadFile);
        if (!file.exists()) {
            return;
        }
        FileInputStream fs = null;
        try {
            sftp.cd(directory);
            fs = new FileInputStream(file);
            sftp.put(fs, file.getName());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fs != null) {
                try {
                    fs.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 下载文件
     *
     * @param directory 下载目录
     * @param downloadFile 下载的文件
     * @param saveFile 存在本地的路径
     * @param sftp
     */
    public static boolean download(String directory, String downloadFile, String saveFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            File file = new File(saveFile);
            FileOutputStream os = new FileOutputStream(file);
            sftp.get(downloadFile, os);
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 删除文件
     *
     * @param directory 要删除文件所在目录
     * @param deleteFile 要删除的文件
     * @param sftp
     */
    public static void delete(String directory, String deleteFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            sftp.rm(deleteFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Disconnect with server
     */
    public static void disconnect(ChannelSftp sftp) {
        if (sftp != null) {
            if (sftp.isConnected()) {
                sftp.disconnect();
            } else if (sftp.isClosed()) {
                logger.debug("sftp is closed already");
            }
        }

    }

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ftp简介

ftp 即 文件传输协议 。

        文件传输协议使得主机间可以共享文件。 FTP 使用TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似TELNET协议在主机间交换命令和消息。文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录。

1、工作原理


文件传输协议是TCP/IP提供的标准机制。用来将文件从一个主机复制到另一个主机。FTP使用TCP的服务。

2、主要功能

提供文件的共享(计算机程序 / 数据); 支持间接使用远程计算机; 使用户不因各类主机文件存储器系统的差异而受影响; 可靠且有效的传输数据。
FTP ,尽管可以直接被终端用户使用,但其应用主要还是通过程序实现。
FTP 控制帧即指 TELNET 交换信息,包含 TELNET 命令和选项。然而,大多数 FTP 控制帧是简单的 ASCII 文本,可以分为 FTP 命令或 FTP 消息。 FTP 消息是对 FTP 命令的响应,它由带有解释文本的应答代码构成。


3、ftp的使用命令

 连接服务器:

  格式:ftp [hostname| ip-address]
  a)在linux命令行下输入:ftp 192.168.10.163
  b)服务器询问你用户名和口令,分别输入lx和相应密码,待认证通过即可。

  1. 下载文件
  下载文件通常用get和mget这两条命令。
  a) get
  格式:get [remote-file] [local-file]
  将文件从远端主机中传送至本地主机中.
  如要获取服务器上E:\rays\1.bmp,则
  ftp> get /rays/1.bmp 1.bmp 
  b) mget      
  格式:mget [remote-files]
  从远端主机接收一批文件至本地主机.
  如要获取服务器上E:\rays\下的所有文件,则
  ftp> cd /rays
  ftp> mget *.* 
  注意:文件都下载到了linux主机的当前目录下。比如,在 /home/lx下运行的ftp命令,则文件都下载到了/home/lx下。

  2.上传文件
  a) put
  格式:put local-file [remote-file]
  将本地一个文件传送至远端主机中.
  如要把本地的1.bmp传送到远端主机E:\rays,并改名为333.bmp
  ftp> put 1.bmp /rays/333.bmp
  b) mput
  格式:mput local-files
  将本地主机中一批文件传送至远端主机.
  如要把本地当前目录下所有bmp文件上传到服务器E:\rays 下
  ftp> cd /rays
  ftp> mput *.bmp 
  注意:上传文件都来自于主机的当前目录下。比如,在/home/lx下运行的ftp命令,则只有在/home/lx下的文件linux才会上传到服务器E:\rays 下。

  3. 断开连接
  bye:中断与服务器的连接。

  ftp> bye

4、java代码实现ftp服务器的登陆连接,注销登录,上传、下载、删除文件

 附带:所需jar依赖配置

<dependency>
          <groupId>commons-net</groupId>
          <artifactId>commons-net</artifactId>
          <version>2.0</version>
</dependency>

上传文件到FTP服务器:

    /**
         * Description: 向FTP服务器上传文件
         * @param url FTP服务器hostname
         * @param port FTP服务器端口,如果默认端口请写-1
         * @param username FTP登录账号
         * @param password FTP登录密码
         * @param path FTP服务器保存目录
         * @param filename 上传到FTP服务器上的文件名
         * @param input 输入流
         * @return 成功返回true,否则返回false
         */  
        public static boolean uploadFile(String url, int port, String username, String password, String path,  
            String filename, InputStream input)  
        {  
            boolean success = false;  
            FTPClient ftp = new FTPClient();  
            try  
            {  
                int reply;  
                  
                // 连接FTP服务器  
                if (port > -1)  
                {  
                    ftp.connect(url, port);  
                }  
                else  
                {  
                    ftp.connect(url);  
                }  
                  
                // 登录FTP  
                ftp.login(username, password);  
                reply = ftp.getReplyCode();  
                if (!FTPReply.isPositiveCompletion(reply))  
                {  
                    ftp.disconnect();  
                    return success;  
                }  
                ftp.changeWorkingDirectory(path);  
                ftp.storeFile(filename, input);  
                  
                input.close();  
                ftp.logout();  
                success = true;  
            }  
            catch (IOException e)  
            {  
                success = false;  
                logger.error(EXCEPTION_NAME, e);  
            }  
            finally  
            {  
                if (ftp.isConnected())  
                {  
                    try  
                    {  
                        ftp.disconnect();  
                    }  
                    catch (IOException e)  
                    {  
                        logger.error(EXCEPTION_NAME, e);  
                    }  
                }  
            }  
            return success;  
        }  

从FTP服务器下载文件:

    /**
         * Description: 从FTP服务器下载文件
         * @Version1.0 Jul 27, 2008 5:32:36 PM by 崔红保(cuihongbao@d-heaven.com)创建
         * @param url FTP服务器hostname
         * @param port FTP服务器端口
         * @param username FTP登录账号
         * @param password FTP登录密码
         * @param remotePath FTP服务器上的相对路径
         * @param fileName 要下载的文件名
         * @param localPath 下载后保存到本地的路径
         * @return
         */  
        public static boolean downloadFile(String url, int port, String username, String password, String remotePath,  
            String fileName, String localPath)  
        {  
            boolean success = false;  
            FTPClient ftp = new FTPClient();  
            try  
            {  
                int reply;  
                  
                // 连接FTP服务器  
                if (port > -1)  
                {  
                    ftp.connect(url, port);  
                }  
                else  
                {  
                    ftp.connect(url);  
                }  
                  
                ftp.login(username, password);//登录  
                reply = ftp.getReplyCode();  
                if (!FTPReply.isPositiveCompletion(reply))  
                {  
                    ftp.disconnect();  
                    return success;  
                }  
                ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录  
                FTPFile[] fs = ftp.listFiles();  
                for (FTPFile ff : fs)  
                {  
                    if (ff.getName().equals(fileName))  
                    {  
                        File localFile = new File(localPath + "/" + ff.getName());  
                          
                        OutputStream is = new FileOutputStream(localFile);  
                        ftp.retrieveFile(ff.getName(), is);  
                        is.close();  
                    }  
                }  
                  
                ftp.logout();  
                success = true;  
            }  
            catch (IOException e)  
            {  
                logger.error(EXCEPTION_NAME, e);  
            }  
            finally  
            {  
                if (ftp.isConnected())  
                {  
                    try  
                    {  
                        ftp.disconnect();  
                    }  
                    catch (IOException e)  
                    {  
                        logger.error(EXCEPTION_NAME, e);  
                    }  
                }  
            }  
            return success;  
        }  

 

删除FTP服务器上的文件:

    /**
         * <删除FTP上的文件>
         * <远程删除FTP服务器上的录音文件>
         * @param url FTP服务器IP地址
         * @param port FTP服务器端口
         * @param username FTP服务器登录名
         * @param password FTP服务器密码
         * @param remotePath 远程文件路径
         * @param fileName 待删除的文件名
         * @return
         * @see [类、类#方法、类#成员]
         */  
        public static boolean deleteFtpFile(String url, int port, String username, String password, String remotePath,  
            String fileName)  
        {  
            boolean success = false;  
            FTPClient ftp = new FTPClient();  
            try  
            {  
                int reply;  
                  
                // 连接FTP服务器  
                if (port > -1)  
                {  
                    ftp.connect(url, port);  
                }  
                else  
                {  
                    ftp.connect(url);  
                }  
                  
                // 登录  
                ftp.login(username, password);  
                reply = ftp.getReplyCode();  
                if (!FTPReply.isPositiveCompletion(reply))  
                {  
                    ftp.disconnect();  
                    return success;  
                }  
                  
                // 转移到FTP服务器目录  
                ftp.changeWorkingDirectory(remotePath);  
                success = ftp.deleteFile(remotePath + "/" + fileName);  
                ftp.logout();  
            }  
            catch (IOException e)  
            {  
                logger.error(EXCEPTION_NAME, e);  
                success = false;  
            }  
            finally  
            {  
                if (ftp.isConnected())  
                {  
                    try  
                    {  
                        ftp.disconnect();  
                    }  
                    catch (IOException e)  
                    {  
                        logger.error(EXCEPTION_NAME, e);  
                    }  
                }  
            }  
            return success;  
        } 

0 0
原创粉丝点击