使用Windows批处理脚本保护FTP

eiee3dmh  于 2023-11-21  发布在  Windows
关注(0)|答案(4)|浏览(127)

我目前在不同的服务器上有批处理脚本,它们将csv文件传输到不同位置的FTP服务器。我的脚本类似于以下内容:

echo user ftp_user> ftpcmd.dat
echo password>> ftpcmd.dat
echo put c:\directory\%1-export-%date%.csv>> ftpcmd.dat
echo quit>> ftpcmd.dat
ftp -n -s:ftpcmd.dat ftp.MyFTPSite.com
del ftpcmd.dat

字符串
如果我想要求安全传输,我的脚本将如何更新?
谢谢.

lqfhib0f

lqfhib0f1#

首先,请确保您理解,如果您需要使用Secure FTP(=FTPS,根据您的文本)或SFTP(根据您使用的标签)。
Windows命令行ftp.exe都不支持。正如你所建议的,你可以使用WinSCP。它支持FTPS和SFTP。
使用WinSCP,您的批处理文件将如下所示(对于SFTP):

echo open sftp://ftp_user:[email protected] -hostkey="..." >> ftpcmd.dat
echo put c:\directory\%1-export-%date%.csv >> ftpcmd.dat
echo exit >> ftpcmd.dat
winscp.com /script=ftpcmd.dat
del ftpcmd.dat

字符串
批处理文件:

winscp.com /log=ftpcmd.log /script=ftpcmd.dat /parameter %1 %date%


虽然使用了WinSCP的所有功能(特别是直接在命令行和%TIMESTAMP%语法上提供命令),但批处理文件简化为:

winscp.com /log=ftpcmd.log /command ^
    "open sftp://ftp_user:[email protected] -hostkey=""...""" ^
    "put c:\directory\%1-export-%%TIMESTAMP#yyyymmdd%%.csv" ^
    "exit"


有关-hostkey开关的用途,请参阅在脚本中验证主机密钥。
比手动组装脚本/批处理文件更简单的是在WinSCP GUI中设置和测试连接设置,然后让它为您生成脚本或批处理文件:
x1c 0d1x的数据
您只需要调整源文件名(使用前面所示的%TIMESTAMP%语法)和日志文件的路径。
对于FTPS,将open command中的sftp://替换为ftpes://(显式TLS/SSL)或ftps://(隐式TLS/SSL)。并删除-hostkey开关。

winscp.com /log=ftpcmd.log /command ^
    "open ftps://ftp_user:[email protected] -explicit" ^
    "put c:\directory\%1-export-%%TIMESTAMP#yyyymmdd%%.csv" ^
    "exit"


如果您的服务器证书不是由可信机构颁发的,则可能需要添加-certificate开关。
同样,与SFTP一样,在WinSCP GUI中设置和测试连接设置更容易,然后让它为您生成脚本或批处理文件。
查看完整的conversion guide from ftp.exe to WinSCP
你也应该阅读Guide to automating file transfers to FTP server or SFTP server
注意使用%TIMESTAMP#yyyymmdd%而不是%date%%date%变量值的格式是特定于区域设置的。因此,请确保在实际使用脚本的同一区域设置上测试脚本。例如,在我的捷克区域设置中,%date%解析为čt 06. 11. 2014,当用作文件名的一部分时可能会出现问题。
出于这个原因,WinSCP支持本地(与区域无关)时间戳格式化。例如,%TIMESTAMP#yyyymmdd%在任何区域都解析为20170515

  • (我是WinSCP的作者)*
3bygqnnd

3bygqnnd2#

内置的FTP命令没有安全功能。请使用cUrl。它是可脚本化的,更健壮,并且具有FTP安全性。

owfi6suc

owfi6suc3#

PowerShell中的一个小代码片段,用于在WinSCP未在路径中注册但winscp.exe可用时简化调用(默认值指向Install-Module WinSCP目录):

function Send-WinScpCommand ([string]$command, [string]$connection = "sftp://username:[email protected]/", [string]$hostkey = "*", [string]$WinSCPDirectory = "$((Get-Module winscp).Path)\..\bin\") {
    Write-Host $command
    pushd; cd "$WinSCPDirectory"
    .\winscp.exe -loglevel=1 /log="C:\Temp\WinSCP.log" <#-console#> -command "open $connection -hostkey=$hostkey" "$command" "close" "exit" | Out-Null # Sync wait
    popd
}

字符串
使用方法:

Send-WinScpCommand "get `"`"/ftpdir/distantfile.txt`"`" `"`"c:\temp\localfile.txt`"`""
Send-WinScpCommand "put `"`"c:\temp\localfile.txt`"`" `"`"/ftpdir/distantfile.txt`"`""


使用此函数和sftp的原始帖子答案(我的用例):Send-WinScpCommand "put c:\directory\%1-export-%%TIMESTAMP#yyyymmdd%%.csv"
根据@Stephan的要求,批次等效物:

echo "%programfiles%\WindowsPowerShell\Modules\WinSCP\6.1.2.0\bin\WinSCP.exe" -loglevel=1 /log="C:\Temp\WinSCP.log" -command "open sftp://username:[email protected] -hostkey=*" %1 "close" "exit">Send-WinScpCommand.bat


使用方法:

Send-WinScpCommand "get ""/ftpdir/distantfile.txt"" ""c:\temp\localfile.txt"""
Send-WinScpCommand "put ""c:\temp\localfile.txt"" ""/ftpdir/distantfile.txt"""

o2rvlv0m

o2rvlv0m4#

ftps -a -z -e:on -pfxfile:"S-PID.p12" -pfxpwfile:"S-PID.p12.pwd" -user:<S-PID number> -s:script <RemoteServerName> 2121

S-PID.p12 => certificate file name ;
S-PID.p12.pwd => certificate password file name ; 
RemoteServerName =>  abcd123 ; 
2121 => port number ; 
ftps => command is part of ftps client software ;

字符串

相关问题