Надежный способ проверки соединения ssh (открытый / закрытый ключ) без присмотра - PullRequest
0 голосов
/ 09 января 2019

Я бы хотел, чтобы тестовый тест прошел / не прошел на основе автоматической проверки открытого / закрытого ключа ssh.

Я знаю, что могу использовать что-то вроде этого:

ssh -T git@github.com

, который даст такой результат, как:

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

Очевидно, что это пользовательское сообщение, и оно будет изменяться для разных служб.

Я надеялся, что это вернет успешный статус, но когда я использую следующий фрагмент в node.js:

const { exec }  = require('child_process');

exec('ssh -T git@github.com', (error, stdout, stderr) => {
            if (error) {
              console.error(`exec error: ${error}`);
            } else {
              console.log('success');
            }
          });

Результат в случае ошибки:

exec error: Error: Command failed: ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not provide shell access.

Это потому, что код выхода определяется удаленным в этих случаях, а github дает статус выхода 1. Я заметил, что битбакет дает и код выхода 0, который, я думаю, более уместен в этом случае.

Я также заметил, что, если я использую что-то недопустимое, я еще не настроил его в своей конфигурации ssh. например: sst -T git@test.github.com это просто приведет к истечению времени ожидания моего теста. Я могу использовать это как неудачу, но мне было просто любопытно, если бы был более стандартный / надежный способ обнаружить это в автоматическом тесте.

Я посмотрел справочную страницу для ssh и могу установить тайм-аут для запроса, например:

ssh -T -o ConnectTimeout=1 git@github.org

Я также могу использовать echo $? для проверки кода выхода и обнаружил, что если он не проходит проверку подлинности (если у меня не настроен открытый / закрытый ключ) или если время ожидания истекло, я получаю код выхода 255. Это все еще не является пуленепробиваемым, так как кажется, что сервер может также отправить это, если он хочет по любой произвольной причине.

Типичное сообщение об ошибке аутентификации:

git@github.com: Permission denied (publickey).

Я думаю, что это может быть более стандартное сообщение об ошибке ... но содержание может измениться для этого (например, пользовательский баннер).

1 Ответ

0 голосов
/ 19 января 2019

Сообщение об ошибке для ошибки аутентификации является сообщением клиента ssh. Вы можете проверить исходный код на https://github.com/openssh/openssh-portable/blob/master/sshconnect2.c

        Authmethod *method = authmethod_get(authlist);
        if (method == NULL)
            fatal("%s@%s: Permission denied (%s).",
                authctxt->server_user, authctxt->host, authlist);

Эта часть будет стабильной, пока вы сохраняете тот же локальный ssh-клиент. Вы можете использовать это как индикатор для неудачной аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...