Обратился ко мне коллега с проблемой - по какой-то причине сервер непрерывной сборки jenkins не может работать через scp с одним из отданных ему хостов.
Для работы с scp в jenkins был настроен SCP plugin, которому указывается хост, порт, имя и пароль пользователя. При этом коллеге удавалось с этими учётными данными зайти на хост используя терминальный ssh клиент. Более того, сообщение об ошибке появлялось уже после ввода имени пользователя, до ввода пароля.
Информация в server.log сервера приложений оказалась крайне информативной:
[#|2013-11-11T19:37:21.175+0400|SEVERE|glassfish3.1.2|be.certipost.hudson.plugin.SCPRepositoryPublisher|_ThreadID=26;_ThreadName=Thread-2;|Auth fail|#]
[#|2013-11-11T19:37:21.176+0400|SEVERE|glassfish3.1.2|be.certipost.hudson.plugin.SCPRepositoryPublisher|_ThreadID=26;_ThreadName=Thread-2;|Cant connect to server|#]
За информативность этого сообщения стоит выразить особую благодарность автору плагина за "классический" код:
try {
try {
site.createSession();
site.closeSession();
} catch (JSchException e) {
throw new IOException("Cant connect to server");
}
ok();
} catch (IOException e) {
error(e.getMessage());
}
Зачем сообщать пользователю о причине возникновения ошибки, если можно выдать какое нибудь своё сообщение?
Возникшее предположение о неполном или неправильном файле .ssh/known_host
не подтвердилось. Зато выяснилось, что проблем нет работе с sshd
серверами под управлением Solaris, но при попытке соединения с другими серверами под управлением FreeBSD проблема сохранялась.
Диагностировать проблему удалось только запустив sshd
в отладочном режиме, который сообщил:
Received disconnect from 192.168.X.X: 3: com.jcraft.jsch.JSchException: Auth fail [preauth]
Оказалось, что SCP plugin для jenkins для работы с ssh использует библиотеку JSch. А вот с аналогичной проблемой при использовании JSch люди уже сталкивались. И решается она разрешением PasswordAuthentication
в sshd_config
:
PasswordAuthentication yes