2016-11-20 3 views
0

Apache camel FTP 및 AWS 모듈 (v2.18)을 사용하여 SFTP와 AWS S3 간의 경로를 만듭니다. SFTP 위치에 대한 연결은 ssh jump-host를 통해 설정됩니다.Apache camel을 사용하여 SFTP (jumhost를 통해)에 연결할 수 없습니다.

유닉스 명령을 통해 연결할 수 : 나는 봄 -Integration와 I를 사용하여 SFTP에 연결 시도 테스트를 위해

 Cannot connect/login to: sftp://[email protected]:22    

: 아파치 낙타를 사용하여 연결하는 동안 오류를 얻고있다 그러나

sftp -o UserKnownHostsFile=/dev/null 
     -o StrictHostKeyChecking=no 
     -i /path/to/host/private-key-file 
     -o 'ProxyCommand=ssh 
      -o UserKnownHostsFile=/dev/null 
      -o StrictHostKeyChecking=no 
      -i /path/to/jumphost/private-key-file 
      -l jumphostuser jump.host.com nc sftp.host.com 22' [email protected] 

아래에서 언급 한 동일한 프록시 구현 (JumpHostProxyCommand)을 사용하여 성공적으로 수행 할 수있었습니다.

Jsch 프록시 : 아래

내가 사용하고 봄 부팅 + 아파치 낙타 코드

 import com.jcraft.jsch.*; 

     class JumpHostProxyCommand implements Proxy { 

       String command; 
       Process p = null; 
       InputStream in = null; 
       OutputStream out = null; 

       public JumpHostProxyCommand(String command) { 
        this.command = command; 
       } 

       public void connect(SocketFactory socket_factory, String host, int port, int timeout) throws Exception { 


        String cmd = command.replace("%h", host); 
        cmd = cmd.replace("%p", new Integer(port).toString()); 

        p = Runtime.getRuntime().exec(cmd); 
        log.debug("Process returned by proxy command {} , {}", command, p); 
        in = p.getInputStream(); 
        log.debug("Input stream returned by proxy {}", in); 
        out = p.getOutputStream(); 
        log.debug("Output stream returned by proxy {}", out); 
       } 

       public Socket getSocket() { 
        return null; 
       } 

       public InputStream getInputStream() { 
        return in; 
       } 

       public OutputStream getOutputStream() { 
        return out; 
       } 

       public void close() { 
        try { 
         if (p != null) { 
          p.getErrorStream().close(); 
          p.getOutputStream().close(); 
          p.getInputStream().close(); 
          p.destroy(); 
          p = null; 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }   

봄을 부팅 낙타 구성 :

@Configuration 
    public class CamelConfig { 

     @Autowired 
     DataSource dataSource; 


     @Bean(name = "jdbcMsgIdRepo") 
     public JdbcMessageIdRepository JdbcMessageIdRepository() { 
      return new JdbcMessageIdRepository(dataSource,"jdbc-repo"); 
     } 

     @Bean(name = "s3Client") 
     public AmazonS3 s3Client() { 
      return new AmazonS3Client(); 
     } 

     @Bean(name="jumpHostProxyCommand") 
     JumpHostProxyCommand jumpHostProxyCommand() 
     { 
      String proxykeyFilePath = "/path/to/jumphost/private-key-file"; 

      String command = "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /proxy/host/key/path -l jumphostuser jump.host.com nc %h %p"; 
      log.debug("JumpHostProxyCommand : " + command); 
      return new JumpHostProxyCommand(command); 
     } 

     } 

낙타 경로 빌더 :

  @Component 
      public class FtpRouteInitializer extends RouteBuilder { 

      @Value("${s3.bucket.name}") 
      private String s3Bucket; 

      @Autowired 
      private JdbcMessageIdRepository repo; 


      @Override 
      public void configure() throws Exception { 

       String ftpRoute = "sftp://[email protected]:22/?" 
        + "delay=300s" 
        + "&noop=true" 
        + "&idempotentRepository=#jdbcMsgIdRepo" 
        + "&idempotentKey=${file:name}-${file:modified}" 
        + "&proxy=#jumpHostProxyCommand" 
        + "&privateKeyUri=file:/path/to/host/private-key-file" 
        + "&jschLoggingLevel=DEBUG" 
        + "&knownHostsFile=/dev/null" 
        + "&initialDelay=60s" 
        + "&autoCreate=false" 
        + "&preferredAuthentications=publickey"; 

       from(ftpRoute) 
       .routeId("FTP-S3") 
       .setHeader(S3Constants.KEY, simple("${file:name}")) 
       .to("aws-s3://" + s3ucket + "?amazonS3Client=#s3Client") 
       .log("Uploaded ${file:name} complete."); 
      } 

      }   

build.gradle 파일 : 나는이 오류의 근본 원인을 찾기 위해 지난 2 일 동안 고전을 면치 못하고있다

 task wrapper(type: Wrapper) { 
      gradleVersion = '2.5' 
     } 

     ext { 
       springBootVersion = "1.4.1.RELEASE" 
       awsJavaSdkVersion = "1.10.36" 
       postgresVersion = "11.2.0.3.0" 
       jacksonVersion = "2.8.4" 
       sl4jVersion = "1.7.21" 
       junitVersion = "4.12" 
       camelVersion ="2.18.0" 
     } 

     buildscript { 
      repositories { 
       mavenCentral() 
      } 

      dependencies { 
       classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.1.RELEASE") 
      } 
     } 

     repositories { 
      mavenCentral() 
     } 

     apply plugin: 'java' 
     apply plugin: 'eclipse' 
     apply plugin: 'spring-boot' 

     sourceCompatibility = 1.8 
     targetCompatibility = 1.8 

     springBoot { 
      executable = true 
     } 

     dependencies { 

      //logging 
      compile("ch.qos.logback:logback-classic:1.1.3") 
      compile("ch.qos.logback:logback-core:1.1.3") 
      compile("org.slf4j:slf4j-api:$sl4jVersion") 

      //Spring boot 
      compile("org.springframework.boot:spring-boot-starter-web:$springBootVersion") 
      compile("org.springframework.boot:spring-boot-starter-jdbc:$springBootVersion") 
      compile("org.apache.camel:camel-spring-boot-starter:$camelVersion") 

      //Jdbc 
      compile("postgresql:postgresql:9.0-801.jdbc4") 

      //Camel 
      compile("org.apache.camel:camel-ftp:$camelVersion") 
      compile("org.apache.camel:camel-aws:$camelVersion") 
      compile("org.apache.camel:camel-core:$camelVersion") 
      compile("org.apache.camel:camel-spring-boot:$camelVersion") 
      compile("org.apache.camel:camel-sql:$camelVersion") 


      //Aws sdk 
      compile("com.amazonaws:aws-java-sdk:$awsJavaSdkVersion") 

      //Json 
      compile("com.fasterxml.jackson.core:jackson-core:$jacksonVersion") 
      compile("com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion") 
      compile("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") 
      compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion") 

      //Swagger 
      compile("io.springfox:springfox-swagger2:2.0.2") 
      compile("io.springfox:springfox-swagger-ui:2.0.2") 

      //utilities 
      compile('org.projectlombok:lombok:1.16.6') 
      compile("org.apache.commons:commons-collections4:4.1") 
      compile("org.apache.commons:commons-lang3:3.4") 



      //Junit 
      testCompile("junit:junit:$junitVersion") 
      testCompile("org.springframework.boot:spring-boot-starter-test:$springBootVersion") 
      testCompile("org.mockito:mockito-all:1.10.19") 

     } 

이 문제에 어떤 도움이 정말 감사합니다. 감사!

+0

내 대답이 문제를 해결 했습니까? – Tushu

답변

0

이 코드를 실행중인 시스템의 ssh 구성 파일에 점프 호스트 구성을 추가하십시오. sftp 명령에서 프록시 또는 점프 호스트를 지정하지 않고 구성 파일에 지정된 호스트의 점프 호스트를 사용하여 서버에 투명하게 연결할 수 있어야합니다.

동적 점프 호스트로 인 설정에 대한 예제 설정은 다음과 같습니다

Host sftp.host.com 
user sftp-user 
IdentityFile /home/sftp-user/.ssh/id_rsa 
ProxyCommand ssh [email protected] nc %h %p 2> /dev/null 
ForwardAgent yes 

호스트 라인에서 여러 호스트 또는 정규식 패턴을 추가 할 수 있습니다. 이 항목은 ~/.ssh/config 파일에서 수행해야합니다 (아직없는 경우이 파일을 작성하십시오).

관련 문제