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(客户端)

PSFTPPuTTY 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的界面如下所示:

 

其中Rootsftp存储文件设置根目录文件夹,点击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

       在这里模仿添加上图中的PathPortPWUser的数值。

 

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

 

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

 

2、使用psftp.exe

 

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

 

 

       输入open [user]@[host]user为用户名,hostsftp服务器的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 阅读(3738) 评论(0)  编辑 收藏 引用 所属分类: C# / Winforms工具插件
只有注册用户登录后才能发表评论。