現(xiàn)在我們過一遍服務器端架設 SSH 訪問的流程。我們還將假定使用類似 Ubuntu 這樣的標準 Linux 發(fā)行版。本例將使用 authorized_keys 方法來給用戶授權。
一、所需軟件軟件安裝與配置git-core是git版本控制核心軟件,安裝openssh-server和openssh-client是由于git需要通過ssh協(xié)議來在服務器與客戶端之間傳輸文件。
sudo apt install git
首先,創(chuàng)建一個名為 'git' 的用戶,并為其創(chuàng)建一個 .ssh 目錄。
sudo adduser git
sudo su git
cd
mkdir .ssh
接下來,把開發(fā)者的 SSH 公鑰添加到這個用戶的 authorized_keys 文件中。如果沒有該文件創(chuàng)建它:
cd /home/git/
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
假設你通過電郵收到了幾個公鑰并存到了臨時文件里。重復一下,公鑰大致看起來是這個樣子:
cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
只要把它們逐個追加到 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
附生成秘鑰方法:
ssh-keygen -t rsa # 這里會提示輸入密碼,我們不輸入直接回車即可
ssh-keygen -t rsa -b 4096 -C "郵箱"
chmod 600 ~/.ssh/id_rsa
為免于git的密碼輸入,需要在服務器上開啟sshd的證書登錄設置:
sudo nano /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
ssh可同時支持publickey和password兩種授權方式,publickey默認不開啟,需要配置為yes。
如果客戶端不存在.ssh/id_rsa,則使用password授權;存在則使用publickey授權;如果publickey授權失敗,依然會繼續(xù)使用password授權。
如果客戶端私鑰證書名稱非默認的id_rsa,則需要設置本地config設置:
nano ~/.ssh/config
# 登錄服務器:11.11.11.11,使用私鑰test_rsa
Host 11.11.11.11
# Hostname gitserver
User git
IdentityFile ~/.ssh/test_rsa
另,客戶端ssh命令可以用-i指定私鑰,-p指定端口:
ssh -i ~/.ssh/myid developer@192.168.1.211 -p 23
現(xiàn)在可以用 --bare 選項運行 git init 來建立一個裸倉庫,這會初始化一個不包含工作目錄的倉庫。
cd ~
mkdir myproject.git
cd myproject.git
git --bare init
這時,Join,Josie 或者 Jessica 就可以把它加為遠程倉庫,推送一個分支,從而把第一個版本的項目文件上傳到倉庫里了。值得注意的是,每次添加一個新項目都需要通過 shell 登入主機并創(chuàng)建一個裸倉庫目錄。我們不妨以 gitserver 作為 git 用戶及項目倉庫所在的主機名。如果在網(wǎng)絡內(nèi)部運行該主機,并在 DNS 中設定 gitserver 指向該主機,那么以下這些命令都是可用的:
在 John 的電腦上
git config--global user.name "name"
git config--global user.email "name@163.com"
cd myproject
git init
git add .
git commit -m 'initial commit'
git remote add origin git@gitserver:~/myproject.git
git push origin master
這樣,其他人的克隆和推送也一樣變得很簡單:
git clone git@gitserver:/opt/git/project.git
cd project
vim README
git commit -am 'fix for the README file'
git push origin master
用這個方法可以很快捷地為少數(shù)幾個開發(fā)者架設一個可讀寫的 Git 服務。
作為一個額外的防范措施,你可以用 Git 自帶的 git-shell 工具限制 git 用戶的活動范圍。只要把它設為 git 用戶登入的 shell,那么該用戶就無法使用普通的 bash 或者 csh 什么的 shell 程序。編輯 /etc/passwd 文件:
sudo vim /etc/passwd
在文件末尾,你應該能找到類似這樣的行:
git:x:1000:1000::/home/git:/bin/sh
把 bin/sh 改為 /usr/bin/git-shell (或者用 which git-shell 查看它的實際安裝路徑,或者/bin/false)。該行修改后的樣子如下:
git:x:1000:1000::/home/git:/usr/bin/git-shell
現(xiàn)在 git 用戶只能用 SSH 連接來推送和獲取 Git 倉庫,而不能直接使用主機 shell。嘗試普通 SSH 登錄的話,會看到下面這樣的拒絕信息:
$ ssh git@gitserver
fatal: What do you think I am? A shell?
Connection to gitserver closed.
進一步鎖定git的密碼,使其不能用密碼連接:
sudo passwd -l git # 鎖定密碼
sudo passwd -u git # 解鎖密碼
指定git提交使用的ssh key
查看repo對應的hostname
git remote -v
origin git@github.com:keysaim/keysaim.github.io.git (fetch)
origin git@github.com:keysaim/keysaim.github.io.git (push)
其中github.com就是repo使用的hostname。
查看repo的用戶信息
git config -l
...
user.email=keysaim@gmail.com
user.name=keysaim
最關鍵的是郵件信息keysaim@gmail.com。如果沒有用戶信息,可以先配置:
git config user.email "keysaim@gmail.com"
git config user.name "keysaim"
注意,很多教程里面以及git的錯誤提示里面會建議在git config后面加入?yún)?shù)git config --global,這里,千萬不要加入此參數(shù),否則它會去嘗試修改你的git的全局配置,也就是你所有repo默認的用戶信息。你可以在文件~/.git/config查看你的全局配置,其中[user]段就是你的默認用戶信息。咱們這里就是為了能夠給這個repo指定特定的ssh key,顯然不適合使用全局的配置。
為repo的用戶生成新的ssh key
ssh-keygen -C "keysaim@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/nbaoping/.ssh/id_rsa): id_rsa.github
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa.github.
Your public key has been saved in id_rsa.github.pub.
The key fingerprint is:
SHA256:G0djI0bh+XwGcwOZ0AsbQ8ffB51pYrfSlRALNZw3igc keysaim@gmail.com
The key's randomart image is:
+---[RSA 2048]----+
| .==o+o=+.+|
| o+o=E.=+Oo|
| ==Bo*oB.+|
| ..*.B.=.o.|
| S + + .. |
| + o |
| . |
| |
| |
+----[SHA256]-----+
其中,-C是用來指定該key的用戶信息的,這里咱們使用了keysaim@gmail.com。該命令是一個交互式的命令,其中大部分你都可以直接回車,但是對于第一個提示Enter file in which to save the key,請務必輸入你想要的文件名,否則它將覆蓋你默認的ssh key,這個可是不可逆的。這里使用文件名id_rsa.github。如果沒有指定文件夾在路徑中,該命令會在當前目錄下生成key文件:
ls id_rsa.github*
id_rsa.github id_rsa.github.pub
其中id_rsa.github是私鑰,而id_rsa.github.pub為公鑰。將key文件移到ssh目錄下~/.ssh/:
mv id_rsa.github* ~/.ssh/
配置ssh以使用新的key
修改ssh的配置文件~/.ssh/config,加入如下配置:
Host github.com
HostName github.com
User git
IdentityFile /Users/nbaoping/.ssh/id_rsa.github
IdentitiesOnly yes
下面逐行解釋:
* Host github.com
用來指定該key的Host名字,此處必須使用本地repo的hostname github.com。
* Hostname github.com
此處指定Host對應的具體域名,這里跟Host保持一致。(Host跟Hostname可以不一致,但是Host必須跟repo的hostname保持一致,也就是git到時候會用自己repo的hostname來ssh配置文件里面找是不是有對應的Host,找到了就使用該配置,具體訪問的域名會采用HostName)
* User git
說明該配置的用戶得是git
* IdentityFile /Users/nbaoping/.ssh/id_rsa.github
這行最為關鍵,指定了該使用哪個ssh key文件,這里的key文件一定指的是私鑰文件。之前我們生成了新的私鑰文件~/.ssh/id_rsa.github,由于博主使用的是MAC,~被翻譯成/Users/nbaoping/了,如果是在一般的Linux環(huán)境下,改路徑前綴該是/home/nbaoping/。
* IdentitiesOnly yes
請配置為yes,具體意義可以參考討論。
將生成的ssh key加入github
打開github ssh key配置頁面,點擊New SSH Key,給剛剛生成的key取名,如keysaim-mac。把~/.ssh/id_rsa.github.pub(請務必注意是公鑰文件,千萬不要搞錯了)里面的內(nèi)容拷貝過來,點擊Add SSH Key按鈕保持。
提交
做完上面的步驟之后,就可以提交了:
git push origin master
Counting objects: 63, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (62/62), done.
Writing objects: 100% (63/63), 838.96 KiB | 0 bytes/s, done.
Total 63 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To github.com:keysaim/keysaim.github.io.git
73a2043..88cacc1 master -> master
可以看到,這次提交成功了。
結語
當你需要把某些repo以不同的用戶提交的時候,可以按照本文給他們配置特殊的ssh key,但是注意的一點就是,這種配置事基于Host,也就是repo的hostname,如果需要確保不同的repo使用不同的ssh key,需要每個repo使用不同的hostname。
參考: