Короткий ответ
Я столкнулся с этой проблемой, и проблема заключалась в том, что в файле /etc /ssh /sshd_config была нарушена политика. Мое было то, что AllowUsers был установлен, и я пытался войти в систему как пользователь, который еще не существует в системе.
Более длинный ответ
Более длинный ответ заключается в том, что пароль был перезаписан. На самом деле это не было пустым. Так уж сложилось, что в первой строке был не отображаемый символ возврата (^ H) и новая строка. Команда чтения, которую я использовал, считывала только первую строку переменной. После использования cat на stdin полное содержимое (как показано vim with:set list) было
"^H$
^M^?INCORRECT^@"
Знак доллара, являющийся новой линией.
После некоторых копаний мы нашли это в исходном коде openssh
https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth-pam.c#L1198
Который показывает, что пароль перезаписывается
https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth-pam.c#L234
Который содержит символы, которые мы ожидали. Комментарии объясняют почему:
/*
* If the user logging in is invalid, or is root but is not permitted
* by PermitRootLogin, use an invalid password to prevent leaking
* information via timing (eg if the PAM config has a delay on fail).
*/
Логика проверки, используемая для пометки authctxt-> valid как false, находится здесь https://github.com/openssh/openssh-portable/blob/df56a8035d429b2184ee94aaa7e580c1ff67f73a/auth.c#L98
В нем изложены все причины, по которым пользователь / пароль может быть неверным.
Изменить: я обновил ссылки, чтобы заблокировать для конкретного коммита, чтобы они оставались правильными. Хотя код изменился, поведение не изменилось.