Unity3D下用C#通过WinSCP命令行方式给Linux服务器SCP传文件

简介:

遇到一个需求是在Unity3D做编辑器工具时需要把生成的AssetBundle包上传到资源服务器,资源服务器用的Linux。

实现分为三部分:1,C#上传工具类;2,WinSCP脚本;3,传参调用使用上传功能。


1,C#上传工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using  UnityEngine;
using  System.Collections;
using  System.IO;
using  System;
using  System.Diagnostics;
 
public  class  UploadHelper
{
 
     public  static  void  callUploadProcess( string  arguments)
     {
 
         string  winScpPath = Directory.GetParent(Application.dataPath) +  "/WinSCP/WinSCP.exe" ;
 
         try
         {
             Process proc =  null ;
 
             bool  redirectOutput =  false ;
 
             proc =  new  Process();
             proc.StartInfo.FileName = winScpPath;
             proc.StartInfo.Arguments = arguments;
 
             if  (redirectOutput)
             {
                 proc.StartInfo.UseShellExecute =  false ;
                 proc.StartInfo.RedirectStandardOutput =  true ;
                 proc.StartInfo.CreateNoWindow =  true ;
             }
             else
             {
                 proc.StartInfo.CreateNoWindow =  false ;
             }
             proc.Start();
 
             if  (redirectOutput)
             {
                 //重定向,显示上传工具输出
                 StreamReader sr = proc.StandardOutput;
                 while  (!sr.EndOfStream)
                 {
                     string  s = sr.ReadLine();
                     UnityEngine.Debug.Log(s);
                 }
             }
 
             proc.WaitForExit();
 
             if  (proc.ExitCode == 0)
             {
                 UnityEngine.Debug.LogFormat( "[{0}] 上传完毕!" , DateTime.Now.ToString( "yyyy-MM-dd HH:mm:ss" ));
             }
             else
             {
                 UnityEngine.Debug.LogFormat( "[{0}] 上传失败! ExitCode:{1}" , DateTime.Now.ToString( "yyyy-MM-dd HH:mm:ss" ), proc.ExitCode);
             }
 
         }
         catch  (Exception ex)
         {
             UnityEngine.Debug.LogError(String.Format( "Exception Occurred :{0},{1}" , ex.Message, ex.StackTrace.ToString()));
         }
     }
}

2,WinSCP脚本,

1
UploadAssetBundles.script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
option  echo  off
option batch on
option confirm off
 
open  scp : // "%1%" : "%2%" @ "%3%"
 
option transfer binary
synchronize remote -mirror -delete %4% %5%
 
chmod  755 %5%/*
 
close
 
exit

3,C#程序内传参调用实现上传功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
private  static  void  UploadToServer(BuildTarget target)
     {
         string  remoteFolder =  null ; //远程服务器资源所在路径
         switch  (target)
         {
             case  BuildTarget.StandaloneWindows64:
                 remoteFolder =  "###/AssetBundle/PC" ;
                 break ;
             case  BuildTarget.Android:
                 remoteFolder =  "###/AssetBundle/Android" ;
                 break ;
             case  BuildTarget.iOS:
                 remoteFolder =  "###/AssetBundle/iOS" ;
                 break ;
             default :
                 return ;
         }
 
         string  uploaderPath = Application.dataPath +  "/Uploader" ;
 
         //脚本路径
         string  scriptPath = uploaderPath +  "/UploadAssetBundles.script" ;
 
         //Log路径
         string  logPath = Directory.GetParent(Application.dataPath) +  "/upload.log" ;
 
         string  localFolder = Application.dataPath +  "/ABs" ; //本地资源目录路径
 
         string [] param ={
                 "test" , //远程服务器登录用户名
                 "test1234" , //远程服务器登录密码                
                 "192.168.1.xxx" , //远程服务器IP或域名                
                 localFolder,
                 remoteFolder,
                 scriptPath,
                 logPath,
             };
 
         string  arguments = String.Format( "/console /log={6} /script={5} /parameter \"{0}\" \"{1}\" \"{2}\" \"{3}\" \"{4}\"" , param);
 
         UploadHelper.callUploadProcess(arguments);
 
     }

arguments最后的

1
/parameter \ "{0}\" \"{1}\" \"{2}\" \"{3}\" \"{4}\""

是传给WinSCP脚本的参数,对应脚本里的“%1%”到“%5%”.



关于WinSCP命令行调用说明可以查看官网https://winscp.net/eng/docs/scripting

WinSCP可以在这下载:http://down.51cto.com/data/2304295

本文转自   zl1030   51CTO博客,原文链接:http://blog.51cto.com/zl1030/1920820

相关文章
|
6天前
|
消息中间件 安全 Linux
服务器(Linux)在线下载activeMQ以及配置打开
服务器(Linux)在线下载activeMQ以及配置打开
19 3
|
1天前
|
运维 Linux 程序员
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
最全查看Linux系统状态脚本_linux查询所有服务器信息的脚本,墙都不扶就服你
|
5天前
|
Linux 网络安全
linux/服务器使用scp将一个服务器文件转移到另一个服务器上
linux/服务器使用scp将一个服务器文件转移到另一个服务器上
33 3
|
6天前
|
监控 JavaScript 网络协议
Linux系统之安装uptime-kuma服务器监控面板
【5月更文挑战第12天】Linux系统之安装uptime-kuma服务器监控面板
20 0
|
6天前
|
关系型数据库 MySQL Linux
服务器Linux系统配置mysql数据库主从自动备份
这是一个基本的配置主从复制和设置自动备份的指南。具体的配置细节和命令可能因您的环境和需求而有所不同,因此建议在操作前详细阅读MySQL文档和相关资源,并谨慎操作以避免数据丢失或不一致。
22 3
|
6天前
|
Oracle Java 关系型数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
【服务器】python通过JDBC连接到位于Linux远程服务器上的Oracle数据库
17 6
|
6天前
|
运维 监控 安全
2023年最详细的:本地Linux服务器安装宝塔面板,并内网穿透实现公网远程登录
2023年最详细的:本地Linux服务器安装宝塔面板,并内网穿透实现公网远程登录
|
6天前
|
Linux 网络安全 数据库
linux centos系统搭建samba文件服务器 NetBIOS解析 (超详细)
linux centos系统搭建samba文件服务器 NetBIOS解析 (超详细)
|
6天前
|
域名解析 存储 缓存
Linux中搭建DNS 域名解析服务器(详细版)
Linux中搭建DNS 域名解析服务器(详细版)
|
Linux 网络安全 Windows
Linux环境搭建 | 使用WinSCP远程连接虚拟机
Linux环境搭建 | 使用WinSCP远程连接虚拟机
455 0
Linux环境搭建 | 使用WinSCP远程连接虚拟机