Git : SSH 协议服务器

SSH协议语法格式

对于拥有 shell 登录权限的用户账号,可以用下面的语法访问 Git 版本库:

语法 1 : ssh://[<username>@]<server>[:<port>]/home/xxx/repo1.git
语法 2 : [<username>@]<server>:/home/xxx/repo1.git

注意 : 
SSH 协议地址格式可以使用两种不同的写法,第一种是使用 ssh:// 开头的标准的 SSH 协议 URL 写法,第二种是 SCP 格式的写法。SSH 协议标准的 URL 写法稍嫌复杂,但是对于非标准 SSH 端口(非 22)可以直接在 URL 中给出端口号。
<username> 是服务器 <server> 上的用户账号,如果省略用户名,则会使用当前登录用户的用户名(配置和使用了主机别名的除外)。
<port> 为SSH 协议端口,默认为 22。当使用了非默认端口时,最好使用语法1。当然使用语法2也可以实现,但是要通过 ~/.ssh/config 配置文件设置主机别名。
路径 /home/xxx/repo1.git 是服务器中版本库的绝对路径。若用相对路径则是相对于 username 用户的家目录。
如果采用口令 认证,必须在每次连接时输入口令。
如果采用公钥认证,则不用输入口令。

服务器架设方式比较

SSH 协议有两种方式来实现 Git 服务。第一种是用标准的 SSH 账号访问版本库。即用户账号可以直接登录到服务器获得 shell。对于这种使用标准 SSH 账号的方式,直接使用标准的 SSH 服务就可以了。
第二种实现方式是所有用户都使用同一个专用的 SSH 账号访问版本库,访问时通过公钥认证的方式。虽然所有用户用同一个账号访问,但可以通过在建立连接时所用的不同公钥来区分不同的用户身份。Gitolite 就是实现该方式的服务器软件。
标准 SSH 账号和专用 SSH 账号这两种实现方式的区别:

标准 SSH Gitolite
账号 每个用户一个账号 所有用户公用同一个账号
认证方式 口令或公钥认证 公钥认证
登录到 shell
安全性
管理员需要 shell
版本库路径 相对路径或绝对路径 相对路径
授权方式 操作系统中用户组和目录权限 通过配置文件授权
分支写授权 Gitolite
路径写授权 Gitolite
假设难易度 简单 复杂

实际上,标准 SSH 也可以用公钥认证的方式实现使用用户公用同一个账号,不过这类似于把一个公共账号的登录口令同时告诉给多个人。具体操作如下:
1.    在服务器端创建一个公共账号,例如 sparker。
2.    管理员收集需要访问git服务的用户公钥。如 user1.pub,user2.pub。
3.    使用 ssh-copy-id 命令将各个 git 用户的公钥远程加入服务器的公钥认证列表中。
       3.1.     远程操作,可以使用 ssh-copy-id 命令。
                 $ ssh-copy-id -i user1.pub [email protected]
                 $ ssh-copy-id -i user2.pub [email protected]
       3.2.     如果直接在服务器上操作,则直接将文件追加到 authorized_keys文件中。
                 $ cat user1.pub >> ~sparker/.ssh/authorized_keys
                 $ cat user2.pub >> ~sparker/.ssh/authorized_keys
4.    在服务器端的 sparker 用户主目录下建立 git 库,就可以实现多个用户利用同一个系统账号(sparker)访问 git 服务了。

这样做除了不必逐一设置账号,以及用户无须口令认证之外,标准 SSH 部署 git 服务的缺点一个也不少,而且因为无法区分用户,也就无法针对用户进行授权。

SSH公钥认证

为实现公钥认证,作为认证的客户端一方需要拥有两个文件,即公钥/私钥对。一般情况下,公钥/私钥对文件创建在用户家目录下的 .ssh 目录中。如果用户家目录中不存在 .ssh 目录,说明 SSH 公钥/私钥对尚未创建。可以用下面的命令创建:

$ ssh-keygen

该命令会在用户家目录下创建 .ssh 目录,并在其中创建两个文件:
1.    id_rsa
私钥文件,它是基于 RSA 算法创建的,一定要妥善保管不要泄露。
2.    id_rsa.pub
公钥文件,和 id_rsa 文件是一对儿,该文件作为公钥文件可以公开。
创建了自己的公钥/私钥对以后,就可以使用下面的命令,实现无口令登录远程服务器 (即用公钥认证取代口令认证)。

$ ssh-copy-id -i .ssh/id_rsa.pub <user>@<server>

注意:
该命令会提示用户输入 user 在 server 上的 SSH 登录口令。
此命令执行成功后,再以 user 用户用 ssh 命令登录 server 远程主机时,不必输入口令即可直接登录。
该命令实际上是将 .ssh/id_rsa.pub 公钥文件追加到远程主机 serve r的 user 家目录下的 .ssh/authorized_keys 文件中。
检查公钥认证是否生效,通过 ssh 命令连接远程主机,正常的话应该直接登录成功。如果要求输入口令则表明公钥认证配置存在问题。如果 SSH 登录存在问题,可以通过查看服务器端的 /var/log/auth.log 文件进行诊断。

SSH主机别名

在实际使用中,有时需要使用多套公钥/私钥对,例如:
1.    使用默认的公钥访问服务器的 git 账号,可以执行 git 命令,但不能进行 shell 登录。
2.    使用特别创建的公钥访问服务器的 git 账号,能够获取 shell,登录后可以对 Git 服务器软件进行升级、维护等操作。
3.    访问 Github 使用其他公钥(非默认公钥)。

从上面的说明可以看出,用户可能拥有不止一套公钥/私钥对。为了创建不同的公钥/私钥对,在使用 ssh-keygen 命令时就需要通过-f参数指定不同的私钥名称。具体用法如下:

$ ssh-keygen -f ~/.ssh/<filename>

请将 <filename> 替换为有意义的名称。命令执行完毕后,会在 ~/.ssh 目录下创建指定的公钥/私钥对:文件 <filename> 是私钥,文件 <filename>.pub 是公钥。

将新生成的公钥添加到远程主机登录用户家目录下的 .ssh/authorized_keys 文件中,就可以使用新创建的公钥建立到远程主机 <server> 的 <user> 账户的无口令登录。操作如下:

$ ssh-copy-id -i .ssh/<filename>.pub <user>@<server>

现在用户存在多个公钥/私钥对,那么当执行下面的 ssh 登录命令时,用到的是哪个公钥呢?

$ ssh <user>@<server>

当然是默认公钥 ~/.ssh/id_rsa.pub。那么如何用新建的公钥连接 server 呢?
SSH 的客户端配置文件 ~/.ssh/config可以通过创建主机别名,在连接主机时选择使用特定的公钥。例如 ~/.ssh/config 文件中的下列配置:

host abc
     user git
     hostname abc.xxx.com
     port 22
     Identityfile ~/.ssh/abc

注意,hostname 也可以写成 IP。

然后执行下面的 SSH 登录命令:

$ ssh abc

或者执行 git 命令:

$ git clone abc:/home/abc/repo1.git

虽然这两条命令各不相同,但是都使用了 SSH 协议,以及相同的主机别名:abc。参考上面在 ~/.ssh/config 文件中建立的主机别名,可以做出如下判断:
1.    登录的SSH主机名为 abc.xxx.com。
2.    登录时使用的用户名为 git。
3.    认证时使用的公钥文件为 ~/.ssh/abc.pub。

时间: 2024-11-08 00:14:00

Git : SSH 协议服务器的相关文章

git ssh 链接服务器报错

原文地址:http://blog.csdn.net/ausboyue/article/details/52775281 Linux SSH命令错误:ECDSA host key "ip地址" for  has changed and you have requested strict checking.记录下方便记忆. 解决方案:在终端上输入以下命令: ssh-keygen -R "你的远程服务器ip地址" 目的是清除你当前机器里关于你的远程服务器的缓存和公钥信息,

CentOS下搭建Git服务器(基于SSH协议)

1,安装Git所需依赖包 # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel # yum install gcc perl-ExtUtils-MakeMaker 2,卸载CentOS自带的git # yum remove git 3,下载较新Git版本 # mkdir /usr/src/tools # cd /usr/src/tools # wget https://www.kernel.org/

CENTOS下搭建git代码仓库 ssh协议

centos服务器下搭建git仓库,使用ssh协议管理仓库代码权限    git官网(http://git-scm.com/) 使用ssh协议: 一.安装git,使用yum install git 或者使用 源码包安装git-2.2.0.tar.gz(https://www.kernel.org/pub/software/scm/git/) 新建git用户与用户组 # useradd git # passwd git 二,新建git仓库(仓库位置自己随用户自己决定,例/var/git/testp

git(学习之四)git协议服务器搭建

####################################################################################################### qq:1218761836 qq群:150181442 E-mail:[email protected] #############################################################################################

SVN使用svn+ssh协议连接服务器时重复提示输入密码 解决办法

TortoiseSVN使用svn+ssh协议连接服务器时重复提示输入密码 当使用svn+ssh协议连接svn服务器时,ssh会提示请求认证,由于不是svn客户端程序来完成ssh的认证,所以不会缓存密码. 而svn客户端通常会建立多个版本库的连接,当密码没有缓存的时候,就会重复不断的提示输入密码. 解决办法是在TortoiseSVN的网络设置里指定SSH客户端使用TortoisePlink.exe并增加-pw password参数和-l username参数. 最终的命令行如下: “C:Progr

paramiko:实现ssh协议,对linux服务器资源的访问

介绍 网络传输是遵循协议的,比如SSH,paramiko则是实现了SSHv2协议的一个python库(底层使用的是cryptography).有了paramiko之后,我们便可以通过python使用ssh协议来连接远程服务器执行操作,不用再通过xshell等工具.安装也很简单,直接pip install paramiko即可 paramiko包含两大核心组件:SSHClient和SFTPClient SSHClient的作用类似于Linux下的ssh命令,是对SSH会话的封装,该类封装了传输(t

搭建git for windows服务器(100%可以成功)【转】

转自:http://blog.csdn.net/code_style/article/details/38764203 既然Git在linux下面非常好用,为什么还要搭建git windows的服务器,因为不是所有的用户都需要在linux下面做开发,对吧,还有很多用户选择使用windows做开发. 看到很多网友尝试部分不成功,所以对内容部分做了修改. 日期:2015.10.14 科普一下: 1.TortoiseGit是什么?没错,是个乌龟,就像它的壳一样,仅仅是个壳,所以离不开真正的git(gi

ssh 协议执行repo sync 报错:Permission denied (publickey)

1.ssh key 已经添加ssh key到gerrit服务器,并且执行ssh协议的git clone可以正常克隆代码到本地,可见不是ssh key的问题. 2.manifest清单文件配置 最初在manifest清单文件中配置: <remote name="origin" fetch="ssh://[email protected]:29418"/> 或者: <remote name="origin" fetch="

搭建git for windows服务器(100%可以成功)

既然Git在Linux下面非常好用,为什么还要搭建git windows的服务器,因为不是所有的用户都需要在linux下面做开发,对吧,还有很多用户选择使用windows做开发. 看到很多网友尝试部分不成功,所以对内容部分做了修改. 日期:2015.10.14 日期:2016.10.15修订 建议安装时都以管理员权限运行,否则可能有些目录创建什么需要权限,尤其是win7用户. 科普一下: 1.TortoiseGit是什么?没错,是个乌龟,就像它的壳一样,仅仅是个壳,所以离不开真正的git(git