Ubuntu18.04服務器上的 Git - 架設服務器

引自

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

參考:

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容