步驟一,從客戶端獲得 SSH 公鑰
為了使客戶端可以向 Git 服務器提供 SSH 公鑰,首先要確認客戶端擁有公鑰。SSH 的密鑰存儲在 ~/.ssh/ 目錄下,下面我們查看一下這里面都有哪些文件:
[user@local ~]$ ls .ssh/ id_rsa id_rsa_osc id_rsa_osc.pub id_rsa.pub known_hosts [user@local ~]$
上面的 xxx 和 xxx.pub 分別是一個 SSH 私鑰和公鑰。
這里 id_rsa(私鑰) 和 id_rsa.pub(公鑰) 是一對兒,而 id_rsa_osc 和 id_rsa_osc.pub 又是一對兒私鑰和公鑰。由此可見,一個用戶是可以擁有多個密鑰的,但是這並不影響我們后面對 Git 服務器的配置,使用任何一個公鑰都可以。
如果用戶沒有密鑰文件,甚至連 .ssh 目錄都沒有,那么說明用戶還沒有創建 SSH 密鑰,我們使用 ssh-keygen 命令可以為其生成密鑰。
[user@local ~]$ ssh-keygen -t RSA -C "user@126.com" Generating public/private RSA key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: e1:ec:5c:cd:89:8f:83:a2:aa:5d:8a:7f:93:12:90:f4 user@126.com The key's randomart image is: +--[ RSA 2048]----+ | | | . | |... . | |o E o . + . | | . S o + | | . o o o | | .... + o . | | o.o+. . . | |oo=+.. | +-----------------+ [user@local ~]$
-t RSA 參數表示使用 RSA 算法。
-C 參數指定用戶的電子郵箱地址。
接下來 ssh-keygen 命令會詢問用戶密鑰文件的存儲路徑以及密碼等,如果不設置密碼直接鍵入回車即可。
密鑰文件默認保存在 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub,公鑰文件內容類似如下:
[user@local ~]$ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVzaGljR5OjgA3VUPO/C/0eIBBhcUQ9v2glTmim1iJ2nOmqTg1lBUlgQCwaIw6f9qJk6J+ibypzJifnic90dfsItlPLBaiMd+/KqZmJymsPOsB2+aQhGXwbj3StTkA1S3KCbUFSRYj3M1CwCGBLxLSyG/wKS/wUeVXtkwAHfSfR7jzkcB5ZyZY6ioxHsMvkCA7ORPaw5zE4MJNw0K9o25sCrgC5RyPUIcEvEt4lo7weaifhNwp5Ql21lVHKknyTALXqETeAhkYrSgueH54srszYJ3A4l+JvpFhHWC/0lF+lZaWtD/VKzs9HSvyYKAs+ovGZAfZY+AC7Et+MWLtlsmf user@126.com [user@local ~]$
至此,從客戶端獲得密鑰的步驟就完成了,接下來需要把公鑰發送個 Git 服務器倉庫管理員。
步驟二,搭建 Git 服務器(已有 Git 服務器管理用戶的可以跳過此步驟)
為了便於管理,需要在系統中建立一個單獨的用戶來管理所有的 Git 倉庫。
[user@local ~]$ sudo adduser git Adding user `git' ... Adding new group `git' (1001) ... Adding new user `git' (1001) with group `git' ... Creating home directory `/home/git' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for git Enter the new value, or press ENTER for the default Full Name []: git Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y [user@local ~]$
我們給這個用戶取名為 git。
所有的遠程 Git 倉庫都可以在這個用戶名下建立,所以以后建立新庫或者將新用戶的 SSH 公鑰添加到服務器時,都使用這個用戶操作就可以了。
步驟三,建立遠程倉庫(已有遠程倉庫的可以跳過此步驟)
切換到新建的 git 帳號,並建立一個空的遠程倉庫。
[user@local ~]$ su git Password: git@Linux:/home/user$ cd ~ git@Linux:~$ mkdir project.git git@Linux:~$ cd project.git git@Linux:~/project.git$ git init --bare Initialized empty Git repository in /home/git/project.git/ git@Linux:~$
建立遠程倉庫使用 git init 命令,也可以增加 --bare 參數。
寫不寫 --bare 參數有什么區別呢?
我們知道,一般從遠程 clone 下來的倉庫會生成一個獨立的目錄,在這個目錄下有當前分支最新版本的文件,同時還有一個 .git 文件夾,與 .git 同級的文件夾稱為我們的“工作目錄”,我們的修改都在這個目錄中進行。而 .git 就是我們 Git 本地倉庫的工作目錄,我們 add 和 commit 的東西都會被提交到這個目錄中。
對 git init 命令添加 --bare 參數就表示初始化 Git 倉庫的時候不要創建本地工作目錄,所以相當於 .git 文件夾下的所有內容直接創建到當前目錄下,而不是被放到 .git 目錄下。
在 Git 服務器上建立好倉庫以后,用戶就可以克隆這個倉庫了。等等。。還沒配置用戶 SSH 公鑰呢,這么就讓用戶去下載,肯定還是要輸入密碼才行的。
步驟四,在 Git 服務器上為用戶配置 SSH 公鑰
還是先在 Git 服務器上使用 authorized_keys 文件來管理所有用戶的 SSH 公鑰。
git@Linux:~$ mkdir .ssh git@Linux:~$ touch .ssh/authorized_keys git@Linux:~$ chmod 600 .ssh/authorized_keys git@Linux:~$
ssh/authorized_keys git@Linux:~$ cat /tmp/id_rsa_user2.pub >> ~/.ssh/authorized_keys git@Linux:~$ cat /tmp/id_rsa_user3.pub >> ~/.ssh/authorized_keys git@Linux:~$
現在 user1、user2 和 user3 就可以通過 SSH 公鑰來操作遠程 Git 倉庫了,快去試試吧。
參考: