将密码作为Talend上下文变量从文件中读取时发生异常

将密码作为Talend上下文变量从文件中读取时发生异常,talend,Talend,我目前有一个Talend作业,它从上下文文件中读取数据并将其输入上下文变量。我有一个名为ftppassword的字段,并将硬编码密码存储在上下文文件中。然后,我在作业中有一个上下文变量,并在作业中引用该变量 通过此设置,我的作业可以正常运行,但如果我将上下文文件更改为包含密码文件而不是硬编码密码的位置,则会出现以下异常: Exception in component tFTPConnection_1 com.enterprisedt.net.ftp.FTPException: 530 Login

我目前有一个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**** 上下文参数的输出: 隐式上下文上下文设置键ftphost的值为ftp.host.com 隐式上下文上下文设置键ftpport,值为21 隐式上下文设置键ftpusername的值为myuser 隐式上下文设置键ftppassword,值为/opt/password\u files/DW/test1.password 隐式上下文设置键ftpremotepath,带值/输出/ 隐式上下文设置键ftpfilemask,带值test\u dn.zip 也尝试将ftppassword的数据类型更改为File和Password,但没有成功

作业上的implicit tContextLoad选项相当于在作业的开头放置一个tFileInputDelimited组件,模式有两列:键和值。然后将其读入一个tContextLoad,从而获得在作业中加载上下文的选项名

如果密码文件不是键值格式,则不能以这种方式使用

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

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

为此,您需要使用适当的连接器(如tFileInputDelimited)读入密码文件。如果您正在阅读类似于/etc/passwd的内容,则可以将其拆分为:

用户名 暗语 用户id 组id 用户id信息 主目录 外壳位置 然后,您可以使用tMap填充以下内容的输出模式:

钥匙 价值 然后输入ftppassword作为键,并将密码值连接到value列。您还需要筛选此记录集,以便只设置一个密码,以便在tMap中输出表的表达式筛选器中使用类似ftpUser.equalsrow1.username的内容

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

如果您希望将文件路径传递给另一个包含密码的文件,以便可以拆分依赖项,并允许一个文件包含作业的所有其他上下文,但将密码文件保留在其他位置,那么您可能希望传递指向密码文件的上下文变量,但必须显式使用这是我的工作

在这种情况下,您可能有一个在运行时加载的上下文文件,其中包含可以直接在文件中设置的上下文,如ftpremotepath、ftphost和ftpfilemask,然后是一个ftpusercredentials上下文变量,该变量是一个单独凭证文件的文件路径

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

ftpuser,myuser
ftppasswd,p4ssw0rd
然后,在作业开始时,您将使用tFileInputDelimited组件(模式为2列:键和值)显式读取此内容。然后,您可以将其连接到tContextLoad组件,这也会将第二组上下文变量加载到内存中


然后,您可以通过将它们称为context.ftpuser和context.ftppasswd来正常使用这些文件。

只是为了澄清一下,您所说的密码文件是什么意思?正如在/etc/passwd中一样?很抱歉,我应该进一步澄清,我使用的是隐式tContextLoad。我有一个上下文文件,其中包含一组键值对,其中包含ftphost、ftpusername、ftpport、ftpremotepath、ftpfilemask、,ftppassword等。我想要的用例是将另一个文件作为值传递给ftppassword键,而不是上下文文件中的硬编码密码。该文件不也是硬编码的吗?我不确定我是否理解您想要做什么,所以最好确切地解释一下您想要实现什么,而不考虑实现部分。当然,我想做的是引用上下文文件中的一个文件作为密码,因为我们的生产工程团队可能只是在某个位置添加一个文件,并授予我们的服务帐户从中读取的权限,因此我们不能将其与其他上下文变量一起硬编码。我们使用上下文变量文件的方式是我们有多个作业执行为不同环境设置的服务器。我们的Talend开发人员可以完全与开发作业执行服务器交互,并可以提供开发作业服务器本地的上下文变量文件。管理员用户是唯一可以访问测试和生产的用户 环境及其本地上下文变量文件。然后,我们将对文件的引用硬编码为作业服务器的本地路径,以便每个作业服务器使用与其相关的上下文。这种方法对你有帮助吗?