Com.jcraft.jsch.JSchException: отменить отмену
Я пытаюсь написать Ant script для получения URL-адреса через туннелирование портов.
Он отлично работает, когда я использую пароль (имена xxxx'd для конфиденциальности):
<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)
- Я уверен, что использую правильный ключевой файл (я пытался использовать неправильное имя, которое дает законное исключение FileNotFoundException).
- Я могу успешно ssh из командной строки без запроса пароля.
- Я уверен, что использую правильную кодовую фразу для ключевого файла.
Какова причина этой ошибки и что я могу сделать с ней?
Ответы
Ответ 1
Я отлаживал код. Это было неудачно, потому что мой закрытый ключ не выполнял аутентификацию; JSch молча отменил аутентификацию пароля, которая была отменена, потому что я не указал пароль.
Обработка ошибок JSch сильно засасывает. Повторите шаги, восстановите (отдельный) файл закрытого ключа, используйте ssh -i
, чтобы гарантировать, что вы используете нужный файл, и держите пальцы скрещенными.
Ответ 2
Чтобы соединение 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);
См. Javadocs
Ответ 3
У меня была такая же проблема при использовании задачи sshexec. Я также добавил passphrase attibute, и он отлично работал. создайте ключевую фразу для своего закрытого ключа и добавьте это как атрибут в свою задачу. Также не забудьте перевести свой закрытый ключ в открытый формат ssh, если вы сгенерировали ключ, используя puttygen на окнах.
Ответ 4
Сегодня у меня была аналогичная проблема. Поэтому я думал, что поделюсь своим решением. Я получил то же исключение, но проблема была в том, что у меня был умляут в моем пароле. после выбора нового пароля без него все работало нормально.
Ответ 5
Теперь появилась новая вилка Jsch. Обработка исключений является гораздо более всеобъемлющей. Больше нет глотания или дефолт. Перейдите к https://github.com/vngx/vngx-jsch, чтобы проверить это. Если что-то не работает так, как вы ожидаете, поднимите его как проблему или отправьте запрос на тяну, когда мы его активно поддерживаем. Мы также хотели бы получить его на центральном репозитории maven в ближайшее время.