这个问题最初询问哪种是在SSIS中通过SFTP或FTPS上传文件的最佳方法.现在只列出每种解决方案的优缺点.我个人现在使用CozyRoc的SFTP库,但我已经在某个方面使用了以下每个解决方案.
SSIS组件库
方法:从CozyRoc,Codeplex,BizCrypto,PragmaticWorks或每个开发和生产服务器上的某些其他供应商安装SSIS组件库,并使用SFTP任务上载文件.
优点:易于使用.它看起来,闻起来和感觉就像一个正常的SSIS任务.SSIS还将密码识别为敏感信息,并允许您保护敏感信息的所有常规选项,而不是仅以非安全方式将其存储为明文.适用于其他SSIS任务,例如ForEach Loop Containers.上传和下载失败时出错.当您不知道要下载的远程FTP站点上的文件名称或者在运行时之前您不知道要上载的文件的名称时,可以正常工作.
缺点:除了Codeplex解决方案之外,这需要花费在生产环境中许可.需要在每台开发和生产计算机上安装库.如果是Codeplex解决方案,那么您使用的是任何特定供应商都不支持的软件.这也使您依赖供应商在每个版本之间更新其库.例如,在2008 RTM之前,我在2008年的CTP版本上开发了一个新服务器,而CozyRoc 2005库与它不兼容.最终他们发布了2008兼容版本,但我不得不暂时使用命令行解决方案来解决这个问题.
命令行SFTP程序
方法:安装一个免费的命令行SFTP应用程序,如Putty和WinSCP,并通过运行批处理文件或操作系统进程任务来执行它.这里列出了通过WinSCP执行此操作的说明.
优点:免费,免费,免费.如果您使用Putty,您可以确定它是安全的,因为许多GUI FTP客户端似乎使用Putty.您肯定知道您使用的是SSH2而不是SSH.
缺点:我尝试过的两个命令行实用程序(Putty和Cygwin)需要将SFTP密码存储在非安全位置.我没有找到一种在上传文件时捕获失败或错误的好方法.这个过程看起来并不像SSIS.大多数代码都封装在文本文件中而不是SSIS本身.如果您不知道要上载或下载的文件的确切名称,则很难使用.
一个3RD PARTY C#或VB.NET LIBRARY
方法:安装SFTP或FTPS库并使用引用库的脚本任务来上载文件.(我从未尝试过这个,所以我会猜测它的优点和缺点)
优点:可能很容易捕获错误.应该可以很好地处理变量,因此即使您不知道要上传或下载的文件的确切名称,它也可能很容易使用.
缺点:这是一个结合.NET库的脚本任务.如果您正在使用SSIS,那么您可能更熟悉SSIS任务,然后是.NET代码.脚本任务也很难排除故障,因为它们没有与常规.NET项目相同的调试工具和功能.创建对第三方代码的依赖关系,这些代码可能在不同版本的SQL Server之间不起作用.公平地说,它可能更有可能在不同版本的SQL Server之间工作,而不是第三方SSIS任务库.另一个巨大的骗局 - 我还没有找到一个免费的C#或VB.NET库.所以如果有人知道,那么请告诉我!
我被要求支持隐式和显式FTPS(也称为FTPES).我们目前正在使用.NET FtpWebRequest.是否FtpWebRequest支持两种类型的FTPES,有什么区别?
谢谢
环境:我在64位Windows 7上使用Sun Java JDK 1.8.0_60,使用Spring Integration 4.1.6(内部似乎使用Apache Commons Net 3.3进行FTPS访问).
我正在尝试与我们的应用程序集成,从客户端的FTPS服务器自动下载.我已经使用Spring Integration成功完成了使用Spring Integration的SFTP服务器而没有遇到任何问题,但是这是客户第一次要求我们使用FTPS,并且让它连接起来非常令人费解.虽然在我的实际应用程序中,我正在使用XML bean配置Spring Integration,试图了解什么不起作用我正在使用以下测试代码(虽然我在这里匿名实际的主机/用户名/密码):
final DefaultFtpsSessionFactory sessionFactory = new DefaultFtpsSessionFactory();
sessionFactory.setHost("XXXXXXXXX");
sessionFactory.setPort(990);
sessionFactory.setUsername("XXXXXXX");
sessionFactory.setPassword("XXXXXXX");
sessionFactory.setClientMode(2);
sessionFactory.setFileType(2);
sessionFactory.setUseClientMode(true);
sessionFactory.setImplicit(true);
sessionFactory.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
sessionFactory.setProt("P");
sessionFactory.setProtocol("TLSv1.2");
sessionFactory.setProtocols(new String[]{"TLSv1.2"});
sessionFactory.setSessionCreation(true);
sessionFactory.setCipherSuites(new String[]{"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"});
final FtpSession session = sessionFactory.getSession();
//try {
final FTPFile[] ftpFiles = session.list("/");
logger.debug("FtpFiles: {}", (Object[]) ftpFiles);
//} catch (Exception ignored ) {}
session.close();
Run Code Online (Sandbox Code Playgroud)
我正在运行此代码以-Djavax.net.debug=all打印所有TLS调试信息.
与FTPS服务器的主要"控制"连接工作正常,但是当它试图打开列表的数据连接(或我尝试过的任何其他数据连接)时,我得到了一个javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake,由...引起的java.io.EOFException: SSL peer shut down incorrectly.如果我取消注释session.list …
我是Spring Framework的新手,事实上,我正在学习和使用Spring Boot.最近,在我正在开发的应用程序中,我使Quartz Scheduler工作,现在我想让Spring Integration在那里工作:FTP连接到服务器来写入和读取文件.
我想要的是非常简单(因为我已经能够在以前的Java应用程序中这样做).我有两个Quartz Jobs计划每天在不同的时间点击:其中一个从FTP服务器读取文件,另一个将文件写入FTP服务器.
我将详细介绍我迄今为止开发的内容.
@SpringBootApplication
@ImportResource("classpath:ws-config.xml")
@EnableIntegration
@EnableScheduling
public class MyApp extends SpringBootServletInitializer {
@Autowired
private Configuration configuration;
//...
@Bean
public DefaultFtpsSessionFactory myFtpsSessionFactory(){
DefaultFtpsSessionFactory sess = new DefaultFtpsSessionFactory();
Ftp ftp = configuration.getFtp();
sess.setHost(ftp.getServer());
sess.setPort(ftp.getPort());
sess.setUsername(ftp.getUsername());
sess.setPassword(ftp.getPassword());
return sess;
}
}
Run Code Online (Sandbox Code Playgroud)
我将以下课程命名为FtpGateway,如下所示:
@Component
public class FtpGateway {
@Autowired
private DefaultFtpsSessionFactory sess;
public void sendFile(){
// todo
}
public void readFile(){
// todo
}
}
Run Code Online (Sandbox Code Playgroud)
我正在阅读本文档以学习如何操作.Spring Integration的FTP似乎是事件驱动的,所以我不知道如何在确切的时间触发触发器时执行Jobs中的sendFile()和readFile().
文档告诉我一些使用入站通道适配器(从FTP读取文件?),出站通道适配器(将文件写入FTP?)和出站网关(做什么?):
Spring Integration支持通过FTP/FTPS发送和接收文件,提供三个客户端端点:入站通道适配器,出站通道适配器和出站网关.它还为定义这些客户端组件提供了方便的基于命名空间的配置选项.
所以,我还没有明白如何遵循.
拜托,有人可以给我一个暗示吗? …
我正在编写一个通过FTP站点同步文件的应用程序.现在它正在通过常规FTP连接,但现在我们的IT人员希望通过安全的FTPS连接进行设置.
他们为我提供了一个*.cr_证书文件.如果我在记事本中打开文件,我会看到类似的东西(但真正的键显然不是foobar).
-----BEGIN RSA PRIVATE
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
FOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBARFOOBAR
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
如何使用此证书文件连接到FTPS服务器以上载和下载文件?原谅我,但我对涉及通过网络传输文件,安全连接,证书,公钥,私钥等等的任何事情都很陌生......等等......
我想我想使用FtpWebRequest对象并将EnableSsl属性设置为true.但我不确定这个证书文件在哪里发挥作用.
我正在尝试基于EventMachine编写一个简单的FTPS服务器.
控制插座正常工作.使用数据套接字进行数据传输时,似乎一切正常(TLS握手成功完成并收到数据),但后来收到错误消息.这是我在Filezilla中得到的:
Command: LIST
Response: 150 Opening ASCII mode data connection for file list
Trace: CFtpControlSocket::TransferParseResponse()
Trace: code = 1
Trace: state = 4
Trace: CFtpControlSocket::SendNextCommand()
Trace: CFtpControlSocket::TransferSend()
Trace: state = 5
Trace: CTransferSocket::OnConnect
Trace: CTlsSocket::Handshake()
Trace: gnutls_session_get_data on primary socket failed: -51
Trace: CTlsSocket::ContinueHandshake()
Trace: CTlsSocket::OnSend()
Trace: CTlsSocket::OnSend()
Trace: CTlsSocket::OnRead()
Trace: CTlsSocket::ContinueHandshake()
Trace: CTlsSocket::OnRead()
Trace: CTlsSocket::ContinueHandshake()
Trace: Handshake successful
Trace: Cipher: AES-256-CBC, MAC: SHA1
Trace: CTlsSocket::OnRead()
Trace: CTransferSocket::OnConnect
Trace: CTransferSocket::OnReceive(), m_transferMode=0
Listing: -rwxrwxrwx 1 owner group 1011 Dec 12 …Run Code Online (Sandbox Code Playgroud) 我需要连接到能够使用lftp成功连接的FTPS服务器.但是,当我尝试使用Python ftplib.FTP_TLS时,它会超时,堆栈跟踪显示它正在等待服务器发送欢迎消息等.有谁知道问题是什么以及如何克服?我想知道是否需要在服务器端进行某些操作,但是lftp客户端如何正常工作.任何帮助是极大的赞赏.
这是堆栈跟踪:
ftp = ftplib.FTP_TLS()
ftp.connect(cfg.HOST, cfg.PORT, timeout=60)
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 135, in connect
self.welcome = self.getresp()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 210, in getresp
resp = self.getmultiline()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 196, in getmultiline
line = self.getline()
File "C:\Users\username\Softwares\Python27\lib\ftplib.py", line 183, in getline
line = self.file.readline()
File "C:\Users\username\Softwares\Python27\lib\socket.py", line 447, in readline
data = self._sock.recv(self._rbufsize)
socket.timeout: timed out
Run Code Online (Sandbox Code Playgroud)
使用lftp成功登录到同一个ftps服务器:
$ lftp
lftp :~> open ftps://ip_address:990
lftp ip_address:~> set ftps:initial-prot P
lftp ip_address:~> login ftps_user_id ftps_user_passwd
lftp sftp_user_id@ip_address:~> ls
ls: Fatal error: …Run Code Online (Sandbox Code Playgroud) ftp_ssl_connect可以处理TLS上的隐式FTP吗?默认情况下,它使用显式.
我正在尝试上传到一个服务器,该服务器只接受端口990上的隐式ftp over tls; 有没有人遇到这个?你怎么修好它的?
我需要编写一个程序来将一些文件发送到"sftp"服务器.我用Google搜索,但发现有类似的东西叫做"ftp over SSL".
它们是一样的吗?
我想知道是否有人可以指向python的免费ftps模块.
我是python的全新手,但这是我工作项目所需要的.我需要一个ftps客户端连接到第三方ftps服务器.
谢谢,
大卫.