ポートトンネリングを介してURLを取得するAntスクリプトを記述しようとしています。
パスワード(プライバシーのためにxxxxにした名前)を使用するとうまくいきます。
<project default="main">
<target name="main">
<sshsession Host="xxxx"
username="xxxx"
password="xxxx">
<LocalTunnel lport="1080" rhost="xxxx" rport="80"/>
<sequential>
<get src="http://localhost:1080/xxxx" dest="/tmp/xxxx"/>
</sequential>
</sshsession>
</target>
</project>
しかし、次のようにキーファイルを使用すると機能しません。
<sshsession Host="xxxx"
username="xxxx"
keyfile="/Users/xxxx/.ssh/id_dsa"
passphrase="xxxx">
<LocalTunnel lport="1080" rhost="xxxx" rport="80"/>
<sequential>
<get src="http://localhost:1080/xxxx" dest="/tmp/xxxx"/>
</sequential>
</sshsession>
私はこの例外を受け取ります:
/tmp/build.xml:8: com.jcraft.jsch.JSchException: Auth cancel
at com.jcraft.jsch.Session.connect(Session.Java:451)
at com.jcraft.jsch.Session.connect(Session.Java:150)
at org.Apache.tools.ant.taskdefs.optional.ssh.SSHBase.openSession(SSHBase.Java:223)
このエラーの原因は何ですか?それに対して何ができますか?
コードをデバッグしました。私の秘密鍵が認証に失敗したため、これは失敗しました。 JSchは静かにパスワード認証にフォールバックしましたが、パスワードを指定しなかったためキャンセルされました。
JSchのエラー処理は非常に困難です。手順をたどって、(個別の)秘密鍵ファイルを再生成し、ssh -i
を使用して正しいファイルを使用していることを確認し、指を交差させます。
jsch
接続を機能させるには、known_hosts
ファイルと秘密鍵を含むファイルの両方へのパスを指定する必要があります。これは、setKnownHosts
およびaddIdentity
メソッドを使用して行われます。
jsch.setKnownHosts("/path/to/.ssh/known_hosts");
jsch.addIdentity("/path/to/.ssh/id_rsa");
キーにパスフレーズがある場合は、addIdentity
引数リストに追加できます。
jsch.addIdentity("/path/to/.ssh/id_rsa", myPassPhrase);
Sshexecタスクの使用中に同じ問題が発生しました。パスフレーズ属性も追加しましたが、うまくいきました。秘密鍵のパスフレーズを作成し、これをタスクの属性として追加します。また、Windowsでputtygenを使用してキーを生成した場合は、秘密キーをオープンssh形式に変換することを忘れないでください。
今日も同様の問題がありました。だから私も自分の解決策を共有しようと思いました。同じ例外が発生しましたが、問題は実際にパスワードにウムラウトが含まれていることでした。それなしで新しいパスワードを選択した後、すべてがうまくいきました。
現在、Jschの新しいフォークがリリースされています。例外処理ははるかに包括的です。飲み込んだり、デフォルトを設定したりする必要はもうありません。 https://github.com/vngx/vngx-jsch にアクセスして確認してください。期待どおりに機能しない場合は、問題として報告するか、Googleが積極的にメンテナンスしているため、プルリクエストを送信してください。また、Mavenの中央リポジトリにすぐに表示されるようにする予定です。