我想基于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).
答案 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客户端,此部分将保持稳定。您可以将其用作验证失败的指示。