1. 生成 SSH 公鑰
每個需要使用git伺服器的工程師,自己需要生成一個ssh公鑰
進入自己的~/.ssh目錄,看有沒有用 檔案名 和 檔案名.pub 來命名的一對檔案,這個 檔案名 通常是 id_dsa 或者 id_rsa。 .pub 檔案是公鑰,另一個檔案是密鑰。假如沒有這些檔案(或者幹脆連 .ssh 目錄都沒有),你可以用 ssh-keygen 的程式來建立它們,該程式在 Linux/Mac 系統由 SSH 包提供, 在 Windows 上則包含在 MSysGit 包裡:
$ ssh-keygen Generating public/private rsa key pair. Enter fileinwhich to save the key (/Users/schacon/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in/Users/schacon/.ssh/id_rsa. Your public key has been saved in/Users/schacon/.ssh/id_rsa.pub. The key fingerprint is: 43:c5:5b:5f:b1:f1:50:43:ad:20:a6:92:6a:1f:9a:3a [email protected] |
它先要求你确認儲存公鑰的位置(.ssh/id_rsa),然後它會讓你重複一個密碼兩次,如果不想在使用公鑰的時候輸入密碼,可以留白。
現在,所有做過這一步的使用者都得把它們的公鑰給你或者 Git 伺服器的管理者(假設 SSH 服務被設定為使用公鑰機制)。他們隻需要複制 .pub 檔案的内容然後 e-email 之。公鑰的樣子大緻如下:
$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSU GPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3 Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XA t3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/En mZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbx NrRFi9wrf+M7Q== [email protected] linux生成ssh key ssh-keygen -b 2048 -t rsa #這裡的-b 2048 是密鑰加密的長度,最好設大點,有消息稱美國有黑客解決 ssh的密鑰進行破解。 #http://bbs.yuloo.com/thread-860154-1-1.html 直接回車3次 key檔案會儲存在/root/.ssh目錄下 這時候.ssh目下會多出幾個檔案 id_rsa 私鑰檔案 id_rsa.pub 公鑰檔案,這個檔案裡的内容要放到其它主機裡面去。 檢視 id_rsa.pub 檔案 |
2. 架設伺服器
首先,建立一個 ‘git’ 使用者并為其建立一個 .ssh 目錄,在使用者主目錄下:
$ sudo adduser git $ sugit $ cd $ mkdir .ssh |
接下來,把開發者的 SSH 公鑰添加到這個使用者的 authorized_keys 檔案中。假設你通過 e-mail 收到了幾個公鑰并存到了臨時檔案裡。隻要把它們加入 authorized_keys 檔案
$ cat/tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys $ cat/tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys $ cat/tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys |
現在可以使用 –bare 選項運作 git init 來設定一個空倉庫,這會初始化一個不包含工作目錄的倉庫。
$ cd/opt/git $ mkdir project.git $ cd project.git $ git --bare init |
這時,開發人員就可以把它加為遠端倉庫,推送一個分支,進而把第一個版本的工程上傳到倉庫裡了。值得注意的是,每次添加一個新項目都需要通過 shell 登入主機并建立一個純倉庫。我們不妨以 gitserver 作為 git 使用者和倉庫所在的主機名。如果你在網絡内部運作該主機,并且在 DNS 中設定 gitserver 指向該主機,那麼以下這些指令都是可用的:
# 在一個工程師的電腦上 $ cd myproject $ git init $ git add . $ git commit -m 'initial commit' $ git remote add origin [email protected]gitserver:/opt/git/project.git $ git push origin master |
這樣,其他人的克隆和推送也一樣變得很簡單:
$ git clone [email protected]gitserver:/opt/git/project.git $ vim README $ git commit -am 'fix for the README file' $ git push origin master |
用這個方法可以很快捷的為少數幾個開發者架設一個可讀寫的 Git 服務。
作為一個額外的防範措施,你可以用 Git 自帶的 git-shell 簡單工具來把 git 使用者的活動限制在僅與 Git 相關。把它設為 git 使用者登入的 shell,那麼該使用者就不能擁有主機正常的 shell 通路權。為了實作這一點,需要指明使用者的登入shell 是 git-shell ,而不是 bash 或者 csh。你可能得編輯 /etc/passwd 檔案
$ sudovim/etc/passwd |
在檔案末尾,你應該能找到類似這樣的行:
git:x:1000:1000::/home/git:/bin/sh |
把 bin/sh 改為 /usr/bin/git-shell (或者用 which git-shell 檢視它的位置)。該行修改後的樣子如下:
git:x:1000:1000::/home/git:/usr/bin/git-shell |
現在 git 使用者隻能用 SSH 連接配接來推送和擷取 Git 倉庫,而不能直接使用主機 shell。嘗試登入的話,你會看到下面這樣的拒絕資訊:
$ [email protected]gitserver fatal: What do you think I am? A shell? (你以為我是個啥?shell嗎?) Connection to gitserver closed. (gitserver 連接配接已斷開。) |