I am using Apache camel FTP and AWS module (v2.18 ) to create a route
between SFTP and AWS S3. Connection to SFTP location is established via ssh
jump-host.

Able to connect via Unix command :
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'
sftp-u...@sftp.host.com

However I am getting error while connecting using Apache camel :

      Cannot connect/login to: sftp://sftp-u...@sftp.host.com:22               
For testing purposes I tried connecting to SFTP using Spring -Integration
and I was able to do it successfully using the same proxy implementation
(JumpHostProxyCommand) mentioned below.

Below is the Spring boot + Apache Camel code that I have been using:

Jsch proxy :
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();
                    }
                }
            }        
Spring boot camel Configuration :
 @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);
        }

      }

build.gradle file:
    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")

        }
I have been struggling for last 2 days to find out the root cause of the
error, any help on this issue is really appreciated. Thanks!




--
View this message in context: 
http://camel.465427.n5.nabble.com/Not-able-to-connect-to-SFTP-via-jumhost-using-Apache-camel-tp5790282.html
Sent from the Camel Development mailing list archive at Nabble.com.

Reply via email to