最近工作中用到一个SFTP上传文件的功能,因为客户端是C#做的就搜索了一些C#SFTP资料,发现网上除了一篇博客外还没有一篇系列完整的整理文档,就整理了下,希望大家多提建议,共同提高。

 

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

 

C#代码:

         用到了SharpSSH这个第三方动态库,需要添加Tamir.SharpSSH.dllOrg.Mentalis.Security.dllDiffieHellman.dll三个dll的引用。

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

using Tamir.SharpSsh;

using Tamir.SharpSsh.jsch;

 

namespace Controller

{

    class SFTPHelper

    {

        private Session m_session;

        private Channel m_channel;

        private ChannelSftp m_sftp;

 

        //host:sftp地址   user:用户名   pwd:密码         

        public SFTPHelper(string ip, string port, string user, string pwd)

        {

            Logger.info("SFTP ip:" + ip + " port:" + port);

 

            int serverport = Int32.Parse(port);

 

            JSch jsch = new JSch();

            m_session = jsch.getSession(user, ip, serverport);

 

            MyUserInfo ui = new MyUserInfo();

            ui.setPassword(pwd);

            m_session.setUserInfo(ui);

        }

 

        //SFTP连接状态         

        public bool Connected { get { return m_session.isConnected(); } }

 

        //连接SFTP         

        public bool Connect()

        {

            try

            {

                if (!Connected)

                {

                    m_session.connect();

                    m_channel = m_session.openChannel("sftp");

                    m_channel.connect();

                    m_sftp = (ChannelSftp)m_channel;

                }

                return true;

            }

            catch(Exception ex)

            {

                Logger.error("SFTP连接异常!" + ex.ToString());

                return false;

            }

        }

 

        //断开SFTP         

        public void Disconnect()

        {

            if (Connected)

            {

                m_channel.disconnect();

                m_session.disconnect();

            }

        }

 

        //SFTP存放文件         

        public bool Put(string localPath, string remotePath)

        {

            try

            {

                Connect();

                if (this.Connected)

                {

                    Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(localPath);

                    Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(remotePath);

                    m_sftp.put(src, dst);

                    return true;

                }

            }

            catch (Exception ex)

            {

                Logger.error("SFTP上传文件错误!" + ex.ToString());

                return false;

            }

            return false;

        }

 

        //SFTP获取文件         

        public bool Get(string remotePath, string localPath)

        {

            try

            {

                Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String(remotePath);

                Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String(localPath);

                m_sftp.get(src, dst);

                return true;

            }

            catch

            {

                return false;

            }

        }

 

        //删除SFTP文件 

        public bool Delete(string remoteFile)

        {

            try

            {

                m_sftp.rm(remoteFile);

                return true;

            }

            catch

            {

                return false;

            }

        }

 

        //获取SFTP文件列表         

        public ArrayList GetFileList(string remotePath, string fileType)

        {

            try

            {

                Tamir.SharpSsh.java.util.Vector vvv = m_sftp.ls(remotePath);

                ArrayList objList = new ArrayList();

                foreach (Tamir.SharpSsh.jsch.ChannelSftp.LsEntry qqq in vvv)

                {

                    string sss = qqq.getFilename();

                    if (sss.Length > (fileType.Length + 1) && fileType == sss.Substring(sss.Length - fileType.Length))

                    { objList.Add(sss); }

                    else { continue; }

                }

 

                return objList;

            }

            catch

            {

                return null;

            }

        }

 

    }

 

    //登录验证信息         

    public class MyUserInfo : UserInfo

    {

        String passwd;

 

        public String getPassword() { return passwd; }

        public void setPassword(String passwd) { this.passwd = passwd; }

 

        public String getPassphrase() { return null; }

        public bool promptPassphrase(String message) { return true; }

 

        public bool promptPassword(String message) { return true; }

        public bool promptYesNo(String message) { return true; }

        public void showMessage(String message) { }

 

    }

}