Ubuntu18.04服務(wù)器上的 Git - 架設(shè)服務(wù)器

引自

現(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。

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市消返,隨后出現(xiàn)的幾起案子载弄,更是在濱河造成了極大的恐慌,老刑警劉巖撵颊,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宇攻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡倡勇,警方通過(guò)查閱死者的電腦和手機(jī)逞刷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妻熊,“玉大人夸浅,你說(shuō)我怎么就攤上這事∪右郏” “怎么了帆喇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亿胸。 經(jīng)常有香客問(wèn)我坯钦,道長(zhǎng),這世上最難降的妖魔是什么侈玄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任婉刀,我火速辦了婚禮,結(jié)果婚禮上序仙,老公的妹妹穿的比我還像新娘突颊。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布洋丐。 她就那樣靜靜地躺著呈昔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪友绝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天肝劲,我揣著相機(jī)與錄音迁客,去河邊找鬼。 笑死辞槐,一個(gè)胖子當(dāng)著我的面吹牛掷漱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榄檬,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卜范,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鹿榜?” 一聲冷哼從身側(cè)響起海雪,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舱殿,沒(méi)想到半個(gè)月后奥裸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沪袭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年湾宙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冈绊。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侠鳄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出死宣,到底是詐尸還是另有隱情伟恶,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布十电,位于F島的核電站知押,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鹃骂。R本人自食惡果不足惜台盯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畏线。 院中可真熱鬧静盅,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至市咽,卻和暖如春痊银,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背施绎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工溯革, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谷醉。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓致稀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親俱尼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抖单,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容