一、准备工作
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所要启动的应用程序。