現(xiàn)在我們過(guò)一遍服務(wù)器端架設(shè) SSH 訪問(wèn)的流程冒冬。我們還將假定使用類(lèi)似 Ubuntu 這樣的標(biāo)準(zhǔn) Linux 發(fā)行版伸蚯。本例將使用 authorized_keys 方法來(lái)給用戶授權(quán)。
一简烤、所需軟件軟件安裝與配置git-core是git版本控制核心軟件剂邮,安裝openssh-server和openssh-client是由于git需要通過(guò)ssh協(xié)議來(lái)在服務(wù)器與客戶端之間傳輸文件。
sudo apt install git
首先横侦,創(chuàng)建一個(gè)名為 'git' 的用戶挥萌,并為其創(chuàng)建一個(gè) .ssh 目錄。
sudo adduser git
sudo su git
cd
mkdir .ssh
接下來(lái)枉侧,把開(kāi)發(fā)者的 SSH 公鑰添加到這個(gè)用戶的 authorized_keys 文件中引瀑。如果沒(méi)有該文件創(chuàng)建它:
cd /home/git/
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
假設(shè)你通過(guò)電郵收到了幾個(gè)公鑰并存到了臨時(shí)文件里。重復(fù)一下榨馁,公鑰大致看起來(lái)是這個(gè)樣子:
cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
只要把它們逐個(gè)追加到 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 # 這里會(huì)提示輸入密碼憨栽,我們不輸入直接回車(chē)即可
ssh-keygen -t rsa -b 4096 -C "郵箱"
chmod 600 ~/.ssh/id_rsa
為免于git的密碼輸入,需要在服務(wù)器上開(kāi)啟sshd的證書(shū)登錄設(shè)置:
sudo nano /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
ssh可同時(shí)支持publickey和password兩種授權(quán)方式翼虫,publickey默認(rèn)不開(kāi)啟屑柔,需要配置為yes。
如果客戶端不存在.ssh/id_rsa珍剑,則使用password授權(quán)掸宛;存在則使用publickey授權(quán);如果publickey授權(quán)失敗招拙,依然會(huì)繼續(xù)使用password授權(quán)唧瘾。
如果客戶端私鑰證書(shū)名稱非默認(rèn)的id_rsa措译,則需要設(shè)置本地config設(shè)置:
nano ~/.ssh/config
# 登錄服務(wù)器: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 選項(xiàng)運(yùn)行 git init 來(lái)建立一個(gè)裸倉(cāng)庫(kù),這會(huì)初始化一個(gè)不包含工作目錄的倉(cāng)庫(kù)菌羽。
cd ~
mkdir myproject.git
cd myproject.git
git --bare init
這時(shí)掠械,Join,Josie 或者 Jessica 就可以把它加為遠(yuǎn)程倉(cāng)庫(kù)注祖,推送一個(gè)分支猾蒂,從而把第一個(gè)版本的項(xiàng)目文件上傳到倉(cāng)庫(kù)里了。值得注意的是是晨,每次添加一個(gè)新項(xiàng)目都需要通過(guò) shell 登入主機(jī)并創(chuàng)建一個(gè)裸倉(cāng)庫(kù)目錄肚菠。我們不妨以 gitserver 作為 git 用戶及項(xiàng)目倉(cāng)庫(kù)所在的主機(jī)名。如果在網(wǎng)絡(luò)內(nèi)部運(yùn)行該主機(jī)罩缴,并在 DNS 中設(shè)定 gitserver 指向該主機(jī)蚊逢,那么以下這些命令都是可用的:
在 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
這樣,其他人的克隆和推送也一樣變得很簡(jiǎn)單:
git clone git@gitserver:/opt/git/project.git
cd project
vim README
git commit -am 'fix for the README file'
git push origin master
用這個(gè)方法可以很快捷地為少數(shù)幾個(gè)開(kāi)發(fā)者架設(shè)一個(gè)可讀寫(xiě)的 Git 服務(wù)箫章。
作為一個(gè)額外的防范措施烙荷,你可以用 Git 自帶的 git-shell 工具限制 git 用戶的活動(dòng)范圍。只要把它設(shè)為 git 用戶登入的 shell檬寂,那么該用戶就無(wú)法使用普通的 bash 或者 csh 什么的 shell 程序终抽。編輯 /etc/passwd 文件:
sudo vim /etc/passwd
在文件末尾,你應(yīng)該能找到類(lèi)似這樣的行:
git:x:1000:1000::/home/git:/bin/sh
把 bin/sh 改為 /usr/bin/git-shell (或者用 which git-shell 查看它的實(shí)際安裝路徑桶至,或者/bin/false)昼伴。該行修改后的樣子如下:
git:x:1000:1000::/home/git:/usr/bin/git-shell
現(xiàn)在 git 用戶只能用 SSH 連接來(lái)推送和獲取 Git 倉(cāng)庫(kù),而不能直接使用主機(jī) shell镣屹。嘗試普通 SSH 登錄的話圃郊,會(huì)看到下面這樣的拒絕信息:
$ ssh git@gitserver
fatal: What do you think I am? A shell?
Connection to gitserver closed.
進(jìn)一步鎖定git的密碼,使其不能用密碼連接:
sudo passwd -l git # 鎖定密碼
sudo passwd -u git # 解鎖密碼
指定git提交使用的ssh key
查看repo對(duì)應(yīng)的hostname
git remote -v
origin git@github.com:keysaim/keysaim.github.io.git (fetch)
origin git@github.com:keysaim/keysaim.github.io.git (push)
其中g(shù)ithub.com就是repo使用的hostname女蜈。
查看repo的用戶信息
git config -l
...
user.email=keysaim@gmail.com
user.name=keysaim
最關(guān)鍵的是郵件信息keysaim@gmail.com持舆。如果沒(méi)有用戶信息,可以先配置:
git config user.email "keysaim@gmail.com"
git config user.name "keysaim"
注意,很多教程里面以及git的錯(cuò)誤提示里面會(huì)建議在git config后面加入?yún)?shù)git config --global捕儒,這里,千萬(wàn)不要加入此參數(shù),否則它會(huì)去嘗試修改你的git的全局配置帖族,也就是你所有repo默認(rèn)的用戶信息。你可以在文件~/.git/config查看你的全局配置供璧,其中[user]段就是你的默認(rèn)用戶信息。咱們這里就是為了能夠給這個(gè)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是用來(lái)指定該key的用戶信息的生巡,這里咱們使用了keysaim@gmail.com。該命令是一個(gè)交互式的命令见妒,其中大部分你都可以直接回車(chē)孤荣,但是對(duì)于第一個(gè)提示Enter file in which to save the key,請(qǐng)務(wù)必輸入你想要的文件名须揣,否則它將覆蓋你默認(rèn)的ssh key盐股,這個(gè)可是不可逆的。這里使用文件名id_rsa.github耻卡。如果沒(méi)有指定文件夾在路徑中疯汁,該命令會(huì)在當(dāng)前目錄下生成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
下面逐行解釋?zhuān)?/p>
* Host github.com
用來(lái)指定該key的Host名字,此處必須使用本地repo的hostname github.com溃卡。
* Hostname github.com
此處指定Host對(duì)應(yīng)的具體域名溢豆,這里跟Host保持一致。(Host跟Hostname可以不一致瘸羡,但是Host必須跟repo的hostname保持一致漩仙,也就是git到時(shí)候會(huì)用自己repo的hostname來(lái)ssh配置文件里面找是不是有對(duì)應(yīng)的Host,找到了就使用該配置最铁,具體訪問(wèn)的域名會(huì)采用HostName)
* User git
說(shuō)明該配置的用戶得是git
* IdentityFile /Users/nbaoping/.ssh/id_rsa.github
這行最為關(guān)鍵讯赏,指定了該使用哪個(gè)ssh key文件,這里的key文件一定指的是私鑰文件冷尉。之前我們生成了新的私鑰文件~/.ssh/id_rsa.github漱挎,由于博主使用的是MAC,~被翻譯成/Users/nbaoping/了雀哨,如果是在一般的Linux環(huán)境下磕谅,改路徑前綴該是/home/nbaoping/。
* IdentitiesOnly yes
請(qǐng)配置為yes雾棺,具體意義可以參考討論膊夹。
將生成的ssh key加入github
打開(kāi)github ssh key配置頁(yè)面,點(diǎn)擊New SSH Key捌浩,給剛剛生成的key取名放刨,如keysaim-mac。把~/.ssh/id_rsa.github.pub(請(qǐng)務(wù)必注意是公鑰文件尸饺,千萬(wàn)不要搞錯(cuò)了)里面的內(nèi)容拷貝過(guò)來(lái)进统,點(diǎn)擊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
可以看到螟碎,這次提交成功了眉菱。
結(jié)語(yǔ)
當(dāng)你需要把某些repo以不同的用戶提交的時(shí)候,可以按照本文給他們配置特殊的ssh key掉分,但是注意的一點(diǎn)就是俭缓,這種配置事基于Host,也就是repo的hostname酥郭,如果需要確保不同的repo使用不同的ssh key华坦,需要每個(gè)repo使用不同的hostname。
參考: