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

相关文章
|
2月前
|
监控 关系型数据库 Linux
|
1月前
|
缓存 网络协议 数据可视化
WinSCP下载安装并实现远程SSH本地服务器上传文件
WinSCP下载安装并实现远程SSH本地服务器上传文件
|
3月前
|
Linux Shell 开发工具
10分钟让你的Linux Shell终端变得更优雅,更高效——【Linux服务器下OhMyZsh+P10k安装实践】
10分钟让你的Linux Shell终端变得更优雅,更高效——【Linux服务器下OhMyZsh+P10k安装实践】
89 1
|
2月前
|
弹性计算 运维 安全
阿里云服务器Windows和Linux操作系统区别对比
阿里云服务器Windows和Linux操作系统区别对比,性能有差异吗?有,同配置下Linux性能要优于Windows,但这与阿里云无关,仅仅是linux和windows之间的区别。另外,阿里云提供的windows和linux操作系统均为正版授权,用户不需要额外支付许可费用,如何选择?看用户自己的应用程序情况。
|
3月前
|
弹性计算 Linux Shell
阿里云ecs linux系统如何进行系统盘的扩容
【1月更文挑战第25天】【1月更文挑战第122篇】阿里云ecs linux系统如何进行系统盘的扩容
206 1
|
3月前
|
监控 Linux Shell
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
在线上排查问题时,查询日志、查看系统配置和分析操作系统信息是至关重要的。这些操作可以帮助我们深入了解软件和服务的兼容性,并解决潜在的问题。在本次学习中,我们将介绍并深入学习一些我在处理类似问题时常用的指令。通过掌握这些指令,你将能够更加高效地定位和解决线上问题,提高系统的稳定性和性能。让我们一同进入这个学习过程吧!
43 0
【Linux技术专题】「夯实基本功系列」带你一同学习和实践操作Linux服务器必学的Shell指令(排查问题指令 - 下)
|
3天前
|
网络协议 安全 Linux
IDEA通过内网穿透实现固定公网地址远程SSH连接本地Linux服务器
IDEA通过内网穿透实现固定公网地址远程SSH连接本地Linux服务器
|
21天前
|
Ubuntu Linux 虚拟化
【Linux】ubuntu安装samba服务器
【Linux】ubuntu安装samba服务器
|
28天前
|
安全 数据处理 C#
C# Post数据或文件到指定的服务器进行接收
C# Post数据或文件到指定的服务器进行接收
|
1月前
|
Shell Linux Apache
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 apachectl命令 使用教程
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 apachectl命令 使用教程
160 1