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 для Джорджа:

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


person cardician    schedule 04.06.2012    source источник
comment
Для потомков это может быть связано с: issues.apache.org/bugzilla/show_bug .cgi?id=53437   -  person Aaron    schedule 25.04.2013


Ответы (3)


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

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

до

session.connect();

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

person cardician    schedule 04.06.2012
comment
странно, что вчера мой код нормально работал без этого, а теперь будет работать только с этим. Спасибо за это! - person adbar; 19.07.2016
comment
Также, если по какой-то причине вы не можете получить доступ к этим параметрам конфигурации, вы можете просто выполнить System.setIn(null) - person visch; 28.07.2017

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

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

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

session.setConfig(
    "PreferredAuthentications", 
    "publickey,keyboard-interactive,password");
person Martin Prikryl    schedule 20.04.2017

Все ответы верны, я просто добавлю сюда, как это можно сделать для Spring Integration при попытке интеграции с SFTP-сервером.

Итак, если вы используете SFTP Spring Integration и странный пользователь и пароль для Kerberos запрашиваются так же, как запрашивает OP.

Затем измените конфигурацию Spring (я использую конфигурацию интеграции Java Spring, если вы используете конфигурацию XML, вы можете попытаться перевести ее самостоятельно - мне действительно не нравится конфигурация XML: P):

Итак, в bean-компоненте, который вы используете как SessionFactory, вам нужно добавить это изменение в конфигурацию:

@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost("hostname");
    factory.setPort(22);
    factory.setUser("username");
    factory.setPassword("superstrongpassword");
    factory.setAllowUnknownKeys(true);
    factory.setSessionConfig(buildSessionProperties());
    return new CachingSessionFactory<>(factory);
}

/**
 * Build JSch property PreferredAuthentications without "gssapi-with-mic"
 * This way it won't prompt for Kerberos authentication every time it tries to connect
 * to the SFTP.
 */
private Properties buildSessionProperties() {
    Properties sessionProperties = new Properties();
    sessionProperties.setProperty("PreferredAuthentications", "publickey,keyboard-interactive,password");
    return sessionProperties;
}
person hmojica    schedule 25.09.2020