Tamir.SharpSSHクラスライブラリを使用して、SFTPファイル操作を実装します



Use Tamir Sharpssh Class Library Implement Sftp File Operation



序文

VB.NETプロジェクトを変更するときに、ローカルファイルをクラウドにアップロードする必要があったため、Tamir.SharpSSHクラスライブラリを見つけましたが、C#での実装方法に関する情報がたくさんあります。例をVB.NETに変更したいのですが、継承できない問題が発生します。たぶん私はVB.NETに精通しておらず、問題を解決できません。この例をVB.NETのソリューションに組み込むだけで、VB.NETにC#を使用させることができます。この例では、SFTPファイル操作の機能を実現しています。

練習:

  1. C#プロジェクトを元のVB.NETソリューションに追加し、プロジェクト名をJasperSFTPに設定します。
    画像
    画像
  2. JasperSFTPプロジェクトに3つのDLL(DiffieHellman、Org.Mentalis.Security、およびTamir.SharpSSH)を追加して参照します。
    画像
  3. SFTPHelperクラスをJasperSFTPプロジェクトに追加します。完全なコードは次のとおりです。
using System using System.Collections using Tamir.SharpSsh using Tamir.SharpSsh.jsch using Org.Mentalis.Security namespace JasperSFTP { public class SFTPHelper { private Session m_session private Channel m_channel private ChannelSftp m_sftp public SFTPHelper(string host, string user, string pwd) { string[] arr = host.Split(':') string ip = arr[0] int port = 22 if (arr.Length > 1) port = Int32.Parse(arr[1]) JSch jsch = new JSch() m_session = jsch.getSession(user, ip, port) ShellUserInfo ui = new ShellUserInfo() ui.setPassword(pwd) m_session.setUserInfo(ui) } //---------------------------------------------------------- public bool Connected { get { return m_session.isConnected() } } //----------------------------------------------------------- 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 { return false } } //------------------------------------------------------------ public void Disconnect() { if (Connected) { m_channel.disconnect() m_session.disconnect() } } //------------------------------------------------------------ public bool Put(string localPath, string remotePath) { try { 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 { return false } } //------------------------------------------------------------ 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 } } //------------------------------------------------------------ public bool Delete(string remoteFile) { try { m_sftp.rm(remoteFile) return true } catch { return false } } //------------------------------------------------------------ public ArrayList GetFileList(string remotePath) { 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() objList.Add(sss) } return objList } catch { return null } } //------------------------------------------------------------ public void Mkdir(string parentDir, string dirName) { if (dirName == '') return // Remove the rightmost'/'. Int32 len = parentDir.Length if( parentDir[len-1] == '/' ) { parentDir.Remove(len - 1) } ArrayList aList = this.GetFileList(parentDir) if (aList.Contains(dirName)) return m_sftp.mkdir(parentDir + '/' + dirName) } } //------------------------------------------------------------ // Class ShellUserInfo login verification information //------------------------------------------------------------ class ShellUserInfo : 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) { } } //------------------------------------------------------------ }
  1. 元のVB.NETプロジェクトにJasperSFTPへの参照を追加します。
    画像
  2. 次に、SFTPを使用する必要があるフォームにSFTPHelperクラスを作成します。例は次のとおりです。
Imports JasperSFTP Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim sftp As SFTPHelper = New SFTPHelper('xxx.xxx.xxx.xxx', 'my-account', 'my-password') sftp.Connect() If sftp.Put('E: empCC.jpg', '/var/www/html/') Then Label1.Text = 'OK!' Else Label1.Text = 'Fail!' End If sftp.Disconnect() End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim imgFile As String = Application.StartupPath + 'TempCC.jpg' Label1.Text = imgFile Dim sftp As SFTPHelper = New SFTPHelper('xxx.xxx.xxx.xxx', 'my-account', 'my-password') sftp.Connect() If sftp.Get('/var/www/html/CC.jpg', imgFile) Then PictureBox1.Image = Image.FromFile(imgFile) PictureBox1.Refresh() Else Label1.Text = 'Fail!' End If sftp.Disconnect() End Sub End Class

結論:

さまざまなプログラミング言語を.NETに混在させることができることは以前から知っていましたが、試したことはありません。手元のプロジェクトはC#とC ++を組み合わせたVB.NETであり、そのようなソリューションを試してみたいと思います。結果は非常に満足のいくものであり、少なくともC#をVB.NETに変更するためのもつれはありません。



参照:
C#はSFTPプロトコルを介してファイルを操作します
SharpSSH