Соединение 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, поэтому я предпочел бы не останавливать программу, чтобы задать мне эти два вопроса. Есть ли что-то, что я не поставляю, чтобы он не спросил об этом? Что-то мне нужно сделать, чтобы он не спросил? Надеюсь, у кого-то есть идеи. Спасибо.
Ответы
Ответ 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");