从文件中读取密码作为Talend上下文变量时出现异常

时间:2014-12-05 18:57:22

标签: talend

我目前有一个Talend作业,它从上下文文件中读取并提供给上下文变量。我有一个名为ftppassword的字段,并将硬编码密码存储在上下文文件中。然后我在工作中有一个上下文变量,并在我的工作中引用它。

使用此设置我的作业运行正常,但如果我将上下文文件更改为包含密码文件的位置而不是硬编码密码,则会出现以下异常:

Exception in component
tFTPConnection_1 com.enterprisedt.net.ftp.FTPException: 530 Login
incorrect. at
com.enterprisedt.net.ftp.FTPControlSocket.validateReply(FTPControlSocket
.java:11‌​79) at
com.enterprisedt.net.ftp.FTPClient.password(FTPClient.java:1844) at
com.enterprisedt.net.ftp.FTPClient.login(FTPClient.java:1766) – 

**编辑 - 2014-12-08 **** 上下文参数的输出: Implicit_Context_Context设置键“ftphost”,其值为“ftp.host.com” Implicit_Context_Context设置键“ftpport”,值为“21” Implicit_Context_Context设置键“ftpusername”,其值为“myuser” Implicit_Context_Context设置键“ftppassword”,其值为“/opt/password_files/DW/test1.password” Implicit_Context_Context设置键“ftpremotepath”,其值为“/ Output /” Implicit_Context_Context设置键“ftpfilemask”,其值为“test_dn.zip” 还尝试将ftppassword的数据类型更改为文件和密码,但没有运气。

enter image description here

1 个答案:

答案 0 :(得分:0)

作业上的implicit tContextLoad选项相当于在作业开始时使用2列的模式放置tFileInputDelimited组件:keyvalue。然后将其读入tContextLoad(因此选项名称)以加载作业中的上下文。

如果您的密码文件不是键值格式,那么您就无法以这种方式使用它。

最简单的选择是坚持以前的工作方式,并使用implicit tContextLoad加载带有上下文变量的键值对的分隔文件。

另一个选择是不再使用implicit tContextLoad选项执行此操作,而是显式

要执行此操作,您需要使用适当的连接器(如tFileInputDelimited)读入密码文件。如果您正在阅读看起来像/etc/passwd的内容,那么您可以将其拆分为:以获取:

  • 用户名
  • 密码
  • 用户ID
  • 群组ID
  • 用户ID信息
  • 主目录
  • shell location

然后,您可以使用tMap填充输出模式:

然后,您将"ftppassword"作为key输入,并将密码值与value列相关联。您还希望过滤此记录集,这样您只能设置一个密码,因此您可能希望在tMap的输出表的表达式过滤器中使用"ftpUser".equals(row1.username)之类的内容。

然后将此连接到tContextLoad组件,您的作业应从/etc/passwd用户帐户加载"ftpUser"的密码。

如果您希望将文件路径传递到包含密码的另一个文件,以便您可以拆分依赖关系并允许一个文件包含该作业的所有其他上下文,但是将密码文件保留在其他位置,那么您可以#39 ; d想要传递一个指向密码文件的上下文变量,但是你必须在作业中明确地使用它。

在这种情况下,您可能有一个在运行时加载的上下文文件,其中包含ftpremotepathftphostftpfilemask等上下文,可直接在文件中设置,然后是ftpusercredentials上下文变量,它是单独凭据文件的文件路径。

此文件可以是另一个分隔文件,其中包含上下文名称和值的键值对,例如:

ftpuser,myuser
ftppasswd,p4ssw0rd

然后在工作开始时,您将使用具有2列架构的tFileInputDelimited组件显式读取此内容:keyvalue。然后,您可以将其连接到tContextLoad组件,这也将第二组上下文变量加载到内存中。

然后,您可以将它们视为context.ftpusercontext.ftppasswd,将其正常使用。