Apache CamelのSCPコンポーネントを試す
手順
- SSHログイン用のサーバーを立てる(Docker)
- CamelのSCPコンポーネントを使ってSCPする
1. SSHログイン用のサーバーを立てる(Docker)
前提条件:Dockerがインストールされている
a. 必要なファイルを用意する
$ mkdir eg_server && cd eg_server
$ mkdir config_files && cd config_files
$ ssh-keygen -t rsa -m PEM
Enter file in which to save the key (/Users/<username>/.ssh/id_rsa): ./id_rsa_pem
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
$ cd ..
$ vi Dockerfile
以下のDockerfileを作成
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:rootpasswd' | chpasswd
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
RUN sed -i 's/#Port 22/Port 20022/' /etc/ssh/sshd_config
COPY ./config_files/id_rsa_pem.pub /root/.ssh/authorized_keys
EXPOSE 20022
CMD ["/usr/sbin/sshd", "-D"]
この時点でファイル構成は以下になる
b. サーバー用のコンテナを走らせる
$ docker build -t eg_server .
$ docker run -itd -p 20019:20022 --name test_server eg_server
これで、ポート20019番を使ってサーバーにログインできるようになる
$ ssh root@127.0.0.1 -p 20019 -i ./config_files/id_rsa_pem
2. CamelのSCPコンポーネントを使ってSCPする
前提:Javaの実行環境がある
GitHubからサンプルコードをダウンロード
1で作成したid_rsa_pem
をsrc/main/resources/
にコピーし、MainScpを実行
1で動かしたサーバー上にファイルがコピーされている
3. (試した後)クリーンアップ
$ docker container stop test_server
$ docker container rm test_server
$ docker image rm eg_server
簡単な解説
Camel-SCPはJSchというSFTPのライブラリで実装されています。
そのせいか否か、いくつか詰まるポイントがあります。
CamelのSCPはProducerのみ
CamelのSCPコンポーネントはProducerとしてしか使えません。
つまり、Camelを実行している場所から他の場所にコピーすることはできますが、他の場所からファイルをコピーすることはできません。
今回の例では、自分のマシン上のファイルをDockerでたてたサーバーにコピーしています。
Public/Private Keyを生成する際、PEM形式を指定する必要あり
2020年11月の現在、JSchではOpenSSHの鍵形式をサポートしていません。
PEM形式を指定しない場合、以下のようにprivate keyの読み込みでエラーが起きます。
org.apache.camel.component.file.GenericFileOperationFailedException: Cannot load private keyfile: src/data/id_rsa
2018年8月にOpenSSH 7.8がリリースされました。
このバージョンアップでssh-keygen
で作成される鍵のデフォルトがOpenSSLのPEM形式からOpenSSHの形式に変更されたようです。
そのため、ssh-keygen
の際に-m PEM
のオプションをつける必要があります。
strictHostKeyChecking=noに設定する
CamelのSCPコンポーネントのドキュメントをみると、strictHostKeyChecking
はデフォルトでno
に設定されているように思えますが、明示的に設定する必要があります。
参考
Dockerize an SSH service
SCP (Apache Camel公式)
【OpenSSH 7.8】秘密鍵を生成する形式が変更になった件について
Discussion