Git : SSH 协议服务器
SSH 协议用于为 Git 提供远程读写操作,是远程写操作的标准服务。
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 sparker@server
$ ssh-copy-id -i user2.pub sparker@server
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。
Git : SSH 协议服务器的更多相关文章
- Mac下使用终端连接远程使用ssh协议的git服务器
最近换了台新电脑, MacBook pro,拿到新电脑之后小小心喜了一下(终于解脱windows的束缚拥抱mac啦), 然后就开始苦逼的安装各种开发环境了. 之前在windows上使用tortoise ...
- CentOS下搭建Git服务器(基于SSH协议)
1,安装Git所需依赖包 # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel # ...
- 【C#】教你纯手工用C#实现SSH协议作为GIT服务端
SSH(Secure Shell)是一种工作在应用层和传输层上的安全协议,能在非安全通道上建立安全通道.提供身份认证.密钥更新.数据校验.通道复用等功能,同时具有良好的可扩展性.本文从SSH的架构开始 ...
- 15.Git四种协议-本地协议(local)、HTTP协议、SSH协议、Git协议
1.本地协议(loacl) 最基本的协议,其远程仓库其实就是硬盘内部的一个目录(例如D:\\project).常见于团队内的人对一个共享的文件系统(例如NFS)具有访问权限,或者多人共用一台电脑的情况 ...
- 【git】git中使用https和ssh协议的区别以及它们的用法
git可以使用四种主要的协议来传输资料: 本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 git 协议.其中,本地协议由于目前大都是进行远程开发和共享代码所以一般不常 ...
- CENTOS下搭建git代码仓库 ssh协议
centos服务器下搭建git仓库,使用ssh协议管理仓库代码权限 git官网(http://git-scm.com/) 使用ssh协议: 一.安装git,使用yum install git 或 ...
- 使用idea操作git(ssh协议)
问题 我们发现,使用IDEA上的git功能,当使用ssh协议出现了可以commit但无法push和pull的问题,经过测试发现原因是Could not read from remsitory.直接翻译 ...
- Findout之为什么公司内部不能使用SSH协议连接外网服务器
今天在公司学习Linux的过程中,想试着像在Windows中操作Github一样对代码进行克隆,只不过是使用命令行的方式.根据一篇博文(Linux下初次使用Github配置)进行了配置,当我进行到第二 ...
- 本地Git与GitHub服务器建立连接(SSH方式通信)
简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要 ...
随机推荐
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- SQLSERVER走起微信公众帐号全新改版 全新首页
SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...
- Connect() 2016 大会的主题 ---微软大法好
文章首发于微信公众号"dotnet跨平台",欢迎关注,可以扫页面左面的二维码. 今年 Connect 大会的主题是 Big possibilities. Bold technolo ...
- Android笔记——Button点击事件几种写法
Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...
- CSS3 3D立方体效果-transform也不过如此
CSS3系列已经学习了一段时间了,第一篇文章写了一些css3的奇技淫巧,原文戳这里,还获得了较多网友的支持,在此谢过各位,你们的支持是我写文章最大的动力^_^. 那么这一篇文章呢,主要是通过一个3D立 ...
- Oracle手边常用70则脚本知识汇总
Oracle手边常用70则脚本知识汇总 作者:白宁超 时间:2016年3月4日13:58:36 摘要: 日常使用oracle数据库过程中,常用脚本命令莫不是用户和密码.表空间.多表联合.执行语句等常规 ...
- pdo的使用
PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口. PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据. PDO随 ...
- 餐饮连锁公司IT信息化解决方案一
从餐饮企业的信息化需求来说,没有哪一种解决方案能满足所有餐饮企业的信息化建设需要.不同的餐饮业态有不同的业务流程,不同业态的信息化解决方案是目前餐饮企业信息化建设急需的,这种一站式整 ...
- AFN解析器里的坑
AFN框架是用来用来发送网络请求的,它的好处是可以自动给你解析JSON数据,还可以发送带参数的请求AFN框架还可以监测当前的网络状态,还支持HTTPS请求,分别对用的类为AFNetworkReacha ...
- Mysql - 数据库操作
之前介绍了数据库的增删改查, 发现忘记了数据库的一些基本操作, 比如建库, 建表, 改表等等. 那这里就来小结一下数据库sql形式的基本操作. 一.库操作 1. 建库 在建库之前, 可能需要看一下, ...