在无人值守的情况下测试ssh(公钥/私钥)连接的可靠方法

时间:2019-01-09 19:12:25

标签: validation ssh terminal automated-tests

我想基于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。但是我注意到bitbucket给出的退出代码为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).

我认为这可能是更标准的错误消息...但是内容也可以为此更改(a custom banner for example).

1 个答案:

答案 0 :(得分:1)

身份验证失败的错误消息是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客户端,此部分将保持稳定。您可以将其用作验证失败的指示。