C# SharpSsh Private-public a pair key to Upload and Download File

先说说背景

公司要我做一个小的Console应用程序,完成每天的文件上传。要上传的服务器是第三方Linux系统,用的是SSH,公钥秘钥配对的方式。


问题步骤

1.生成公钥私钥,将公钥发给要上传到的第三方服务器

2.用Tamir.SharpSsh 完成上传(StackOverflow看了很多英文,找到的)


公钥秘钥的生成,有很多工具,按照第三方的建议,我使用 puttygen.exe 

官方网址:http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

这个putty工具类挺多的,我们只需要生成公钥和私钥,因此只需要下载  puttygen.exe

下载后打开,操作:

C# SharpSsh Private-public a pair key to Upload and Download File_第1张图片


C# SharpSsh Private-public a pair key to Upload and Download File_第2张图片


很有意思,鼠标在进度条来回画圈,生成的随机码质量就很好


C# SharpSsh Private-public a pair key to Upload and Download File_第3张图片


C# SharpSsh Private-public a pair key to Upload and Download File_第4张图片


Putty公钥秘钥生成的文档说明很多,我就不多说,简单的截图示意。


第一步骤已经完成,接下来第二步,找第三方类库,找呀找,看了很多英文,C# 公钥秘钥的ssh,牛 ,那就是  Tamir.SharpSsh

像沙漠里的一片淡水湖,开始开采使用。

Nuget 项目引用,注意

DiffieHellman.local,Org.Mentalis.Security 是 Tamir.SharpSSH 依赖的类库,不引用它们,你会兜一圈,别问我为什么,问 Tamir,SharpSSH 的开发人

C# SharpSsh Private-public a pair key to Upload and Download File_第5张图片


引用完后,开始使用,开工,我遇到的 问题,花了一天的时间研究,原来是文件版本问题,你们肯定也会遇到


Tamir.SharpSSH 的私钥需要 Open ssh key的格式,所以我们需要转换 Conversions => Export SSH key ,明白?



好了,开工了。什么不说,光贴代码

写了一个Helpe

 public class SSHFTP
    {

        private int _port;
        private string _privateSshKeyPath;
        private Sftp _tamirSftp;


        public SSHFTP(string host, string username, string password)
        {
            this._tamirSftp = new Sftp(host, username, password);
            this._port = 22;
        }

        public SSHFTP(string host, int port, string username, string password)
        {
            this._tamirSftp = new Sftp(host, username, password);
            this._port = port;  
        }

        public SSHFTP(string host, int port, string username, string password, string privateSshKeyPath)
        {
            this._tamirSftp = new Sftp(host, username, password);
            this._port = port;
            this._privateSshKeyPath = privateSshKeyPath;
        }

        private void Connect()
        {
            if (!string.IsNullOrEmpty(this._privateSshKeyPath))
            {
                this._tamirSftp.AddIdentityFile(this._privateSshKeyPath);
            }
            this._tamirSftp.Connect(this._port);
        }

        public bool UploadFiles(string[] files, string toRemotePath)
        {
            if (!this._tamirSftp.Connected)
            {
                this.Connect();
            }

            try
            {
                this._tamirSftp.Put(files, toRemotePath);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                this._tamirSftp.Close();
            }
        }

        public bool UploadFile(string file, string toRemotePath)
        {
            if (!this._tamirSftp.Connected)
            {
                this.Connect();
            }

            try
            {
                this._tamirSftp.Put(file, toRemotePath);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                this._tamirSftp.Close();
            }
        }

        public bool DownloadFiles(string[] files, string toLocalPath)
        {
            if (!this._tamirSftp.Connected)
            {
                this.Connect();
            }

            try
            {
                this._tamirSftp.Get(files, toLocalPath);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                this._tamirSftp.Close();
            }
        }

        public bool DownloadFile(string file, string toLocalPath)
        {
            if (!this._tamirSftp.Connected)
            {
                this.Connect();
            }

            try
            {
                this._tamirSftp.Get(file, toLocalPath);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
            finally
            {
                this._tamirSftp.Close();
            }
        }

        public string[] ListFiles(string remotePath)
        {
            if (!this._tamirSftp.Connected)
            {
                this.Connect();
            }

            string[] files = new string[] { };
            try
            {
                files = this._tamirSftp.GetFileList(remotePath).Cast().ToArray();
            }
            catch (Exception ex)
            {
            }
            finally
            {
                this._tamirSftp.Close();
            }
            return files;
        }

    }


接下来就测试调用:

        #region 目录配置

        private static string targetDirectory = "D://WomplyDailyTransactoinFiles//";
        private static string privateKeyDirectory = "D://WomplyDailyTransactoinFiles//ssh//";
        private static string privateKeyPath = privateKeyDirectory+"Omega_keys_private.openssh.key";         //本地ssh key的路径
        private static string womplyRemoteMerchantDirectory = "to_womply_test/merchant_action_report/";  //服务器要上传或下载的相对目录
     
        #endregion

 private void WomplyUpload(string localFilePath, string remoteFilePath)
        {
            try
            {
                string host = "sftp.womply.com";
                int port = 22;
                string user = "90909090909";   //第三方服务器给你的UserName
                string pass = "";                        //有了private key 就可以不用密码了
                SSHFTP sftp = new SSHFTP(host, port, user, pass, privateKeyPath);
                bool done = sftp.UploadFile(localFilePath, remoteFilePath);
            }
            catch (Exception ex)
            {
                throw new Exception("WomplyUpload Method " + ex.Message);
            }
           
        }

     注意路径:


 测试方法怎么写都可以

需要源码的过来下:看在我认真的情况,给赏一分撒。

http://download.csdn.net/detail/haiyangzhibing/9640967







你可能感兴趣的:(技术问题)