如何在Groovy脚本中配置(传递)位置ID以连接到SFTP服务器?

2020-08-20 04:38发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我需要在Iflow过程中连接到sftp。

我尝试了从Iflow中部的SFTP服务器访问文件,但是我无法通过groovy脚本连接到sftp服务器,并且发生了UnknownHostException。

似乎必须使用云连接器(内部)的位置ID才能连接到sftp,但我不知道如何在groovy脚本中配置位置ID。

有人可以告诉我如何在groovy脚本中配置(传递)位置ID以连接到SFTP吗?

非常感谢!

闪亮的锯齿

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我需要在Iflow过程中连接到sftp。

我尝试了从Iflow中部的SFTP服务器访问文件,但是我无法通过groovy脚本连接到sftp服务器,并且发生了UnknownHostException。

似乎必须使用云连接器(内部)的位置ID才能连接到sftp,但我不知道如何在groovy脚本中配置位置ID。

有人可以告诉我如何在groovy脚本中配置(传递)位置ID以连接到SFTP吗?

非常感谢!

闪亮的锯齿

付费偷看设置
发送
7条回答
d56caomao
1楼-- · 2020-08-20 04:54

您好,

我还没有尝试过,但是您可以尝试。

字符串hostName =" LocationID ^ <输入SFTP服务器的主机名/IP地址>";  

希望这会有所帮助!

感谢和问候,

Praveen T

lukcy2020
2楼-- · 2020-08-20 04:52

嗨,发光锯
您是否设法解决了问题? 如果是,并且答案之一对您有所帮助,请将该答案作为"接受的答案"接受。 如果您的问题仍未解决,请告诉我们,以便我们共同解决问题。

宇峰Kouji
3楼-- · 2020-08-20 04:48

您好, Shine Zaw

云连接器提供了一个SOCKS代理,必须在您的SFTP连接代码中使用它。 从理论上讲,它应该像这样工作:

 JSch jsch = new JSch();
 会话会话=空;
 尝试{
//配置这个变量
 def sftpUsername =" johndoe"
 def sftpHostname =" myserver.com"
 def sftpPassword ="秘密"
 def cloudConnSubaccount =" <云连接的子帐户ID>"
 def cloudConnLocationId =" <云连接的位置ID>"

//创建基本会话
 会话= jsch.getSession(sftpUsername,sftpHostname,22)
 session.setConfig(" StrictHostKeyChecking","否")
 session.setPassword(sftpPassword)
//将Cloud Connector设置为代理
 SocketAddress addr = new InetSocketAddress(" localhost",20004)
     代理Proxy =新的Proxy(Proxy.Type.SOCKS,addr)
 Authenticator.setDefault(new Authenticator(){
         @Override
         受保护的java.net.PasswordAuthentication getPasswordAuthentication(){
 def encodingSubaccount = cloudConnSubaccount.bytes.encodeBase64()。toString()
 def encodingLocationId = cloudConnLocationId.bytes.encodeBase64()。toString()
             返回新的java.net.PasswordAuthentication(" 1。" +编码子帐户+"。" +编码的位置ID,新的char [] {})
         }
     });
 session.setProxy(代理)
//打开会话
 session.connect()


//创建SFTP频道
 频道频道= session.openChannel(" sftp")
 channel.connect()
 ChannelSftp sftpChannel =(ChannelSftp)通道


/* 做任何你想做的事 */


 sftpChannel.exit()
 session.disconnect()
 } catch(JSchException e){
//异常处理
 } catch(SftpException ee){
   //异常处理
 }
 

如果您想从代码中阅读有关Cloud Connector用法的更多信息,请查看以下帮助文章:

https://help.sap.com/viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/zh-CN/c2461c31761b488c828e15b71263f3fd.html

亦是此间程序员
4楼-- · 2020-08-20 04:43
p ,

我有同样的问题。 我需要传递代理的位置ID。
每次我运行iFlow时,都会收到" JSchException ProxySOCKS5:com.jcraft.jsch.JSchException:SOCKS5代理失败"错误。
您对我有什么建议吗?

在此先感谢,

Jozsef

zhangjiyang1323
5楼-- · 2020-08-20 04:42

工作版本:

基本思想是,我使用代理(对于localhost),并传递ProxySOCKS5的locationID(编码)。

然后,我设置会话的代理。

导入com.sap.gateway.ip.core.customdev.util.Message;
 导入java.lang.Object;
 导入java.util.HashMap;
 导入java.io.BufferedReader;
 导入java.io.IOException;
 导入java.io.InputStream;
 导入java.io.InputStreamReader;
 导入com.jcraft.jsch.Channel;
 导入com.jcraft.jsch.ChannelSftp;
 导入com.jcraft.jsch.JSch;
 导入com.jcraft.jsch.JSchException;
 导入com.jcraft.jsch.Session;
 导入com.jcraft.jsch.SftpException;
 导入com.sap.it.api.securestore.SecureStoreService;
 导入com.sap.it.api.securestore.UserCredential;
 导入com.sap.it.api.ITApiFactory;
 导入com.jcraft.jsch.ProxySOCKS5;
 导入java.util.Base64;
 导入java.net.Authenticator;
 导入org.apache.commons.codec.binary.Base64; //或任何其他Base64编码器


 def消息processData(消息消息){
    
     def messageLog = messageLogFactory.getMessageLog(message);

     字符串userName ="";
     字符串密码="";
     字符串hostName =" <虚拟主机名_sftp>";
     字符串filePath =" <您的文件>";
     字符串finalString ="";

     userName =" ";
     密码=" ";
    
     字符串subaccount =" "; //您可以在驾驶舱中找到它
     字符串locationId =" "; //它是可选的
     最终的String encodeSubaccount =新的String(Base64.encodeBase64(subaccount.getBytes()));
     最终的String编码的位置ID =新的String(Base64.encodeBase64(locationId.getBytes()));
 
     def exception ='';
     JSch jsch =新的JSch();
     com.jcraft.jsch.Session session = null;
    
     尝试{
        
         字符串passwHelp ="";
         com.jcraft.jsch.ProxySOCKS5 proxy = new ProxySOCKS5(" localhost",20004);
        
         proxy.setUserPasswd(" 1。" +编码子帐户+"。" +编码的位置ID,passwHelp);
        
         session = jsch.getSession(userName,hostName,);
         session.setConfig(" StrictHostKeyChecking","否");
         session.setPassword(密码);
        
         session.setProxy(proxy);
     session.connect(10000);
    
         频道频道= session.openChannel(" sftp");
         channel.connect();
         ChannelSftp sftpChannel =(ChannelSftp)通道;
        
         InputStream流= sftpChannel.get(filePath);
         尝试{
             BufferedReader br = new BufferedReader(new InputStreamReader(stream));
             弦线;
             while((line = br.readLine())!= null){
             finalString = finalString +行; //您可以在这里拥有自己的逻辑
             }
         } catch(IOException io){
             exception =" IOException" + io.getMessage();
         } catch(Exception e){
            exception ="(Exception" + e.getMessage();
         }
         sftpChannel.exit();
         session.disconnect();
     }
     catch(JSchException e){
         exception =" JSchException" + e.getMessage();
     }
     捕获(SftpException ee){
         exception =" SftpException" + ee.getMessage();
     }
     如果(finalString!= null && finalString!=''&& finalString!=''){
         if(messageLog!= null){messageLog.addAttachmentAsString(" 02-源文件",finalString," text/xml")}
     }


     message.setBody(finalString);


     if(exception!= null && exception!=''&& exception!=''){
         if(messageLog!= null){messageLog.addAttachmentAsString(" 99-Exception",exception," text/xml")}
     }
    
     返回消息;
 }
 
渐行渐远_HoldOn
6楼-- · 2020-08-20 05:03

嗨Praveen,

谢谢您的建议。

我已经按照您的建议进行了尝试,但没有成功。

它仍在发生未知主机异常。

此外,我找到了文档使用用于云的TCP协议 可能与我的要求有关的应用程序

但是我不知道如何在Groovy脚本中转换用于连接sftp服务器的代码。

感谢和问候,

闪亮的锯齿

一周热门 更多>