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 в ближайшее время.