Подтвердить что ты не робот

Соединение SFTP через Java, запрашивающее странную аутентификацию

Итак, я пишу небольшую программу, которая должна подключаться к удаленному серверу через SFTP, вытаскивать файл, а затем обрабатывать файл. Я наткнулся на JSch через некоторые ответы здесь, и это выглядело прекрасно для этой задачи. До сих пор прост в использовании, и у меня это работает, с одной незначительной задачей, которую я хотел бы исправить. Я использую следующий код для подключения и вытягивания файла:

    JSch jsch = new JSch();
    Session session = null;
    try {
        session = jsch.getSession("username", "127.0.0.1", 22);
        session.setConfig("StrictHostKeyChecking", "no");
        session.setPassword("password");
        session.connect();

        Channel channel = session.openChannel("sftp");
        channel.connect();
        ChannelSftp sftpChannel = (ChannelSftp) channel;
        sftpChannel.cd(REMOTE_FTP_DIR);
        sftpChannel.lcd(INCOMING_DIR);
        sftpChannel.get(TMP_FILE, TMP_FILE);
        sftpChannel.exit();
        session.disconnect();
    } catch (JSchException e) {
        e.printStackTrace();
    } catch (SftpException e) {
        e.printStackTrace();
    }

Итак, это работает, и я получаю файл. Я запускаю этот код на сервере linux, и когда я запускаю код, JSch спрашивает у меня имя пользователя и пароль Kerberos. Это выглядит так:

Имя пользователя Kerberos [george]:

Пароль Kerberos для george:

Я просто нажал кнопку ввода для обоих вопросов, а затем программа, похоже, продолжится без проблем. Однако мне нужно, чтобы этот код был автоматизирован с помощью задачи cron, поэтому я предпочел бы не останавливать программу, чтобы задать мне эти два вопроса. Есть ли что-то, что я не поставляю, чтобы он не спросил об этом? Что-то мне нужно сделать, чтобы он не спросил? Надеюсь, у кого-то есть идеи. Спасибо.

4b9b3361

Ответ 1

Думаю, что я бы разместил здесь ответ, потому что в случае, если кто-то еще столкнется с подобной проблемой. Оказывается, у меня отсутствует кусок кода, который имеет значение. Мне просто нужно было добавить

session.setConfig("PreferredAuthentications", 
                  "publickey,keyboard-interactive,password");

перед

session.connect();

и теперь все работает отлично.

Ответ 2

Хотя решение в самопринятом ответе правильное, у него нет никаких объяснений.

Проблема заключается в том, что OP имеет установленную Kerberos/GSSAPI аутентификацию как предпочтительную (по умолчанию JSch). Тем не менее OP, похоже, фактически не использует/не хочет, поскольку OP утверждает, что не указывает ни одно имя пользователя или пароль для запросов Kerberos.

Решение состоит в том, чтобы удалить Kerberos/GSSAPI (gssapi-with-mic) из списка предпочтительных методов проверки подлинности:

session.setConfig(
    "PreferredAuthentications", 
    "publickey,keyboard-interactive,password");