github非开源,不知道它怎么实现的,但是gitlab开源,支持私有化部署,猜测他们实现的方案是一样的。gitlab会在git这个用户的家目录下创建~/.ssh/authorized_keys 文件,这个文件控制的是用户级别的ssh key认证,是ssh自己的方案。具体可以看我以前总结的文章,提到过这个文件: https://blog.dteam.top/posts/...我们先看看gitlab服务器的/etc/passwd的配置:... git:x:998:998::/var/opt/gitlab:/bin/sh ...这样看git用户是允许登录ssh的,但是由于这个用户没有密码,所以只能通过密钥认证,对于密钥认证权限,我们需要检查git用户的~/.ssh/authorized_keys,对于本例来说就是/var/opt/gitlab/.ssh/authorized_keys,我们打开文件看看:... command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-59",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <用户的 ~/.ssh/id_rsa.pub文件的公钥内容> ...这里就很明显了,通过command设置登录后强制运行的命令,其他参数都好理解,关闭了ssh某些功能,那我们具体看看这个命令执行结果呢?$ /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell key-59 Welcome to GitLab, @fengyu!由于开启了no-pty选项,因此你直接ssh git@my_gitlab_server会报错,无法分配一个pty无法登录,只能通过ssh -T git@my_gitlab_server打开一个无pty的非交互式连接,于是执行了command的结果输出Welcome to GitLab, @fengyu!:$ ssh -T git@my_gitlab_server Welcome to GitLab, @fengyu!于是至此真相大白。
github非开源,不知道它怎么实现的,但是gitlab开源,支持私有化部署,猜测他们实现的方案是一样的。
gitlab会在
git
这个用户的家目录下创建~/.ssh/authorized_keys
文件,这个文件控制的是用户级别的ssh key认证,是ssh自己的方案。具体可以看我以前总结的文章,提到过这个文件: https://blog.dteam.top/posts/...我们先看看gitlab服务器的
/etc/passwd
的配置:这样看
git
用户是允许登录ssh的,但是由于这个用户没有密码,所以只能通过密钥认证,对于密钥认证权限,我们需要检查git用户的~/.ssh/authorized_keys
,对于本例来说就是/var/opt/gitlab/.ssh/authorized_keys
,我们打开文件看看:这里就很明显了,通过
command
设置登录后强制运行的命令,其他参数都好理解,关闭了ssh某些功能,那我们具体看看这个命令执行结果呢?由于开启了
no-pty
选项,因此你直接ssh git@my_gitlab_server
会报错,无法分配一个pty无法登录,只能通过ssh -T git@my_gitlab_server
打开一个无pty的非交互式连接,于是执行了command
的结果输出Welcome to GitLab, @fengyu!
:于是至此真相大白。