271 lines
6.1 KiB
C#
271 lines
6.1 KiB
C#
|
|
using Tamir.SharpSsh.jsch;
|
|||
|
|
using System.Collections;
|
|||
|
|
using System;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using System.IO;
|
|||
|
|
using Coolape;
|
|||
|
|
|
|||
|
|
public class SFTPHelper
|
|||
|
|
{
|
|||
|
|
private Session m_session;
|
|||
|
|
private Channel m_channel;
|
|||
|
|
private ChannelSftp m_sftp;
|
|||
|
|
|
|||
|
|
//host:sftp地址 user:用户名 pwd:密码
|
|||
|
|
public SFTPHelper (string host, int _port, string user, string pwd)
|
|||
|
|
{
|
|||
|
|
string[] arr = host.Split (':');
|
|||
|
|
string ip = arr [0];
|
|||
|
|
// int port = 22;
|
|||
|
|
int port = _port;
|
|||
|
|
if (arr.Length > 1)
|
|||
|
|
port = Int32.Parse (arr [1]);
|
|||
|
|
|
|||
|
|
JSch jsch = new JSch ();
|
|||
|
|
m_session = jsch.getSession (user, ip, port);
|
|||
|
|
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 e) {
|
|||
|
|
Debug.Log ("connect failed!!" + e);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//断开SFTP
|
|||
|
|
public void Disconnect ()
|
|||
|
|
{
|
|||
|
|
if (Connected) {
|
|||
|
|
m_channel.disconnect ();
|
|||
|
|
m_session.disconnect ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public bool PutDir (string localDir, string remoteDir, Callback onProgressCallback, Callback onFinishCallback)
|
|||
|
|
{
|
|||
|
|
bool ret = false;
|
|||
|
|
if (!Directory.Exists (localDir)) {
|
|||
|
|
Debug.LogError ("There is no directory exist!");
|
|||
|
|
Utl.doCallback (onFinishCallback, false);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
Mkdir (remoteDir);
|
|||
|
|
string[] files = Directory.GetFiles (localDir);
|
|||
|
|
string file = "";
|
|||
|
|
string[] dirs = Directory.GetDirectories (localDir);
|
|||
|
|
if (files != null) {
|
|||
|
|
for (int i = 0; i < files.Length; i++) {
|
|||
|
|
file = files [i];
|
|||
|
|
Debug.Log (file);
|
|||
|
|
ret = Put (file, remoteDir, onProgressCallback, null);
|
|||
|
|
if (!ret) {
|
|||
|
|
Utl.doCallback (onFinishCallback, false);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (dirs != null) {
|
|||
|
|
for (int i = 0; i < dirs.Length; i++) {
|
|||
|
|
// Debug.Log (PStr.b ().a (remotePath).a ("/").a (Path.GetFileName (dirs [i])).e ());
|
|||
|
|
ret = PutDir (dirs [i], PStr.b ().a (remoteDir).a ("/").a (Path.GetFileName (dirs [i])).e (), onProgressCallback, null);
|
|||
|
|
if (!ret) {
|
|||
|
|
Utl.doCallback (onFinishCallback, false);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Utl.doCallback (onFinishCallback, true);
|
|||
|
|
return ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Mkdir (string dir)
|
|||
|
|
{
|
|||
|
|
try {
|
|||
|
|
m_sftp.mkdir (new Tamir.SharpSsh.java.String (dir));
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
// Debug.LogError (e);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//SFTP存放文件
|
|||
|
|
public bool Put (string localPath, string remotePath, Callback onProgressCallback, Callback onFinishCallback)
|
|||
|
|
{
|
|||
|
|
try {
|
|||
|
|
Tamir.SharpSsh.java.String src = new Tamir.SharpSsh.java.String (localPath);
|
|||
|
|
Tamir.SharpSsh.java.String dst = new Tamir.SharpSsh.java.String (remotePath);
|
|||
|
|
ProgressMonitor progressMonitor = new ProgressMonitor (onProgressCallback, onFinishCallback);
|
|||
|
|
m_sftp.put (src, dst, progressMonitor, ChannelSftp.OVERWRITE);
|
|||
|
|
return true;
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
Debug.LogError (e);
|
|||
|
|
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 (Exception e) {
|
|||
|
|
Debug.LogError (e);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//删除SFTP文件
|
|||
|
|
public bool Delete (string remoteFile)
|
|||
|
|
{
|
|||
|
|
try {
|
|||
|
|
m_sftp.rm (remoteFile);
|
|||
|
|
return true;
|
|||
|
|
} catch {
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Exit ()
|
|||
|
|
{
|
|||
|
|
try {
|
|||
|
|
if (m_sftp != null) {
|
|||
|
|
m_sftp.disconnect ();
|
|||
|
|
m_sftp.quit ();
|
|||
|
|
m_sftp.exit ();
|
|||
|
|
}
|
|||
|
|
} catch (Exception e) {
|
|||
|
|
Debug.LogError (e);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//获取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)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class ProgressMonitor : SftpProgressMonitor
|
|||
|
|
{
|
|||
|
|
private long max = 0;
|
|||
|
|
private long mCount = 0;
|
|||
|
|
private float percent = 0;
|
|||
|
|
Callback onProgress;
|
|||
|
|
Callback onFinish;
|
|||
|
|
|
|||
|
|
// If you need send something to the constructor, change this method
|
|||
|
|
public ProgressMonitor (Callback onProgress, Callback onFinish)
|
|||
|
|
{
|
|||
|
|
this.onProgress = onProgress;
|
|||
|
|
this.onFinish = onFinish;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void init (int op, string src, string dest, long max)
|
|||
|
|
{
|
|||
|
|
this.max = max;
|
|||
|
|
// System.out.println("starting");
|
|||
|
|
// System.out.println(src); // Origin destination
|
|||
|
|
// System.out.println(dest); // Destination path
|
|||
|
|
// System.out.println(max); // Total filesize
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override bool count (long bytes)
|
|||
|
|
{
|
|||
|
|
mCount += bytes;
|
|||
|
|
float percentNow = mCount / (float)max;
|
|||
|
|
if (percentNow > this.percent) {
|
|||
|
|
this.percent = percentNow;
|
|||
|
|
Utl.doCallback (onProgress, percentNow);
|
|||
|
|
// Debug.Log("progress=="+ this.percent); // Progress 0,0
|
|||
|
|
// System.out.println(max); //Total ilesize
|
|||
|
|
// System.out.println(this.count); // Progress in bytes from the total
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return(true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void end ()
|
|||
|
|
{
|
|||
|
|
Utl.doCallback (onFinish, true);
|
|||
|
|
// System.out.println("finished");// The process is over
|
|||
|
|
// System.out.println(this.percent); // Progress
|
|||
|
|
// System.out.println(max); // Total filesize
|
|||
|
|
// System.out.println(this.count); // Process in bytes from the total
|
|||
|
|
}
|
|||
|
|
}
|