KiMoGiGi 技术文集

不在乎选择什么,而在乎坚持多久……

IT博客 首页 联系 聚合 管理
  185 Posts :: 14 Stories :: 48 Comments :: 0 Trackbacks

一、准备工作 

1、 msftpsrvr.exe(服务器端)

由coreftp开发的迷你sftp服务软件,无需任何安装。

网址:http://www.coreftp.com/server/index.html

2、 psftp.exe(客户端)

PSFTP是PuTTY SFTP客户端,用于本地与服务器间安全传输文件(使用SSH连接)。

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

3、 创建Window Service(服务器端)
使用C#语言、Visual Studio 开发工具,创建Window Service,用于管理msftpsrvr.exe在服务器的启动状况。
以服务开启msftpsrvr.exe进程,可以实现系统启动时启动、避免登录用户注销导致进程关闭。


二、具体创建

 

1、服务器配置msftpsrvr.exe

      

msftpsrvr.exe的界面如下所示:

 

其中Root为sftp存储文件设置根目录文件夹,点击Start後程式就会侦听客户端的链接。Connections的列表可以查看当前客户端正在连接的状态。Port推荐为22,其他端口的话会可能被防火墙挡住。

 

填写的所有信息(即User, Password, Port, Root)会以当前登录用户,贮存在注册表中。因此由不同用户登录操作系统的话,此sftp的信息都会分别存储。

 

现在的目标是用Window Service(服务)启动此程序,出现2个问题:

1)                  启动服务是以System用户启动,因此进程msftpsrvr.exe归属于System用户,进程打开后是没有任何UI显示的。因此sftp所需要的信息(即User, Password, Port, Root)就无法设置。

2)                  启动进程,但还需要点击“Start”的按钮。在没有UI的情况怎么令msftpsrvr.exe自动进入Start状态。

 

解决方案:

1)      msftpsrvr.exe保存的信息都在注册表中,如果是当前登录用户,储存的路径就是HKEY_CURRENT_USER\Software\FTPWare。
如下图所示:


       类似的,可以在注册表的用户默认设置,添加sftp的信息。路径为

       HKEY_USERS\.DEFAULT\Software\FTPWare

       在这里模仿添加上图中的Path、Port、PW、User的数值。

 

       这样,以其他任何用户初始打开sftp的时候,都会有我们所设置的默认值,当然包括启动服务的System用户。

 

2)      启动msftpsrvr.exe时,添加 –start 命令参数即可。

 

2、使用psftp.exe

 

       点击打开psftp.exe,出现如下图的命令窗口。

 

 

       输入open [user]@[host],user为用户名,host为sftp服务器的ip,如输入

 

open aaa@172.18.235.56

      

回车后出现以下提示

 

 

输入n,不需要把key缓存;然后提示输入密码。成功连接后,就会返回命令符。

 

输入put [FilePath] 就可以把文件传到sftp的文件夹中。如输入

 

put “D:\temp\temp\sftp架设方案.doc”

 

 

上传文件到sftp成功。

 

以上是命令行操作psftp。如需要像批处理文件,直接执行任务。可利用psftp的命令参数。如下所示:

 

"psftp.exe" aaa@127.0.0.1 -pw aaa -b "aaa.txt" -bc

 

解释:

1)      aaa@127.0.0.1:要直接连接目标sftp服务器,aaa为用户名,127.0.0.1为服务器ip。

2)      –pw aaa:设置密码为aaa。

3)      -b "aaa.txt" :指定需要操作的命令文本。
具体aaa.txt的文本内容,如下所示:
put "FBMS
前台宣导材料再稿.ppt"

4)      –bc:输出执行过的命令语句。

 

这样的话,可以直接执行"psftp.exe" aaa@127.0.0.1 -pw aaa -b "aaa.txt" –bc可以顺利连接服务器并执行指定任务。

 

C#执行的时候就可以拼凑命令字符串,然后直接执行。

 

 

Psftp参数和命令参考

 

Usage: psftp [options] [user@]host

 

Options:

描述

-V

print version information and exit(打印版本)

-pgpfp

print PGP key fingerprints and exit

-b file

use specified batchfile(读取格式化文件,按照文件格式执行命令,及预先要交互的命令都放到这个文件里)

-bc

output batchfile commands (输出执行过的命令语句)

-be

don't stop batchfile processing if errors(遇错跳过)

-v

show verbose messages (详细回显)

-load sessname

Load settings from saved session (使用预先保存好的sessname,保存在HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions)

-l user

connect with specified username (用户名)

-P port

connect to specified port (端口)

-pw passw

login with specified password (密码)

-1 -2

force use of particular SSH protocol version (使用ssh协议)

-4 -6

force use of IPv4 or IPv6 (支持ipv4 或ipv6)

-C

enable compression (支持压缩格式,节省带宽)

-i key

private key file for authentication

-noagent

disable use of Pageant

-agent

enable use of Pageant

-batch

disable all interactive prompts 不允许交互命令

 

psftp命令:

 

命令

描述

bye 

结束 psftp 。

cd  

改变远程服务器的目录。

chmod

改变远程服务器的文件或文件夹的权限及属性。

del  

删除远程服务器上的文件。

dir  

列出远程服务器上的所有文件和目录。

exit 

结束 psftp 。

get  

从远程服务器上下载指定文件。

help 

使用帮助。

lcd  

改变本地计算机的工作目录。

lpwd

显示本地计算机工作目录。

ls   

列出远程服务器上的所有文件和目录。

mkdir

在远程服务器上建立一个目录。

mv 

移动远程服务器上的文件或者改名。

open

连接指定的远程服务器。

put 

把本地的文件上传到远程服务器上。

pwd 

移动远程服务器上的文件或者改名。

quit

结束 psftp 。

reget 

断点下载未完的指定文件。

ren 

移动远程服务器上的文件或者改名。

reput

断点上传未完的指定文件。

rm 

刪除远程服务器上的一个文件。

rmdir

刪除远程服务器上的一个目录。

 

3、开发window service

 

       Window Service的作用在于Window Service可以以System的用户启动进程,System用户是不会注销的,因此其他登录用户注销时,可以避免以服务开启的进程关闭。

 

       Visual Studio开发Window服务,先新建“Windows 服务”项目。

 

      

       在Service1.cs中编写服务启动代码:

   

  

  public partial class Service1 : ServiceBase

    {        

        
public Service1()

        {

            InitializeComponent();

        }

 

        
protected override void OnStart(string[] args)

        {

            StartSftpServer();

        }

 

        
protected override void OnStop()

        {

        }

 

        
private void StartSftpServer()

        {

            
if (Process.GetProcessesByName("msftpsrvr.exe").Length == 0)

            {

                Process p 
= new Process();

 

                ProcessStartInfo startInfo 
= new ProcessStartInfo();

                startInfo.Arguments 
= "-start";

                startInfo.FileName 
= @"d: \msftpsrvr.exe";

                p.StartInfo 
= startInfo;

 

                p.Start();

            }

        }

    }

 

       显示Services1的设计界面,点击右键选择“添加安装程序”。在项目就会自动生成ProjectInstaller.cs。用于配置Window服务的基本信息。

 

 

       注意选择serviceProcessInstaller的时候,Accout要需要选择LocalSystem,这样服务才会以System用户启动。

 

       编译后,需要用.net framework的命令符把服务注册到操作系统中。如下选择Visual Studio 命令提示。

 

 

       在命令行输入如下指令,即可成功把服务应用程序安装到操作系统。

InstallUtil "D:\temp\WindowsService1\bin\Debug\WindowsService1.exe"

      


 

三、 其他改进

 

1、 msftpsrvr.exe的注册表设置可以到处一个reg文件,方便导入注册表。

2、 Window Service可以设置一个定时器,每隔一段时间查看进程是否在启动中,如果没有则开启。

3、 Window Service提供输入参数的设置,可以灵活配置Window Service所要启动的应用程序。


posted on 2008-12-29 21:51 KiMoGiGi 阅读(3906) 评论(0)  编辑 收藏 引用 所属分类: C# / Winforms 、工具插件
只有注册用户登录后才能发表评论。