本文鏈接:https://blog.csdn.net/toopoo/article/details/85227241
關(guān)閉
原創(chuàng)
Win10 Ubuntu子系統(tǒng)設(shè)置Git服務(wù)器和SSH Server 證書登錄,實現(xiàn)win10和macOS源碼同步
2018-12-24 13:06:34?SimonLiu009?閱讀數(shù) 419更多
分類專欄:?Git?Windows?Ubuntu?Linux
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循?CC 4.0 BY-SA?版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/toopoo/article/details/85227241
首先是安裝Win10的Ubuntu子系統(tǒng),如果沒有,可以看到我另外一篇博文的相關(guān)內(nèi)容:
Visual Studio Code 與 Win10 64bit Ubuntu bash 的ESP8266 編譯開發(fā)環(huán)境搭建(無需編譯toolchain)
首先右鍵點擊開始按鈕-”運行“-"bash",進入Ubuntu bash命令行
如果沒有安裝過git,那么安裝一下:
$ sudo aptinstallgit
然后添加一個git用戶, 輸入 sudo adduser git
$ sudo adduser git
然后根據(jù)提示輸入密碼
Adding user `git' ...
Addingnewgroup`git' (1001) ...
Addingnewuser `git' (1001) with group `git' ...
Creating home directory `/home/git' ...
Copying filesfrom`/etc/skel' ...
EnternewUNIX password:
RetypenewUNIX password:
passwd: password updated successfully
Changing the user informationforgit
Enter thenewvalue,orpress ENTERforthedefault
? ? ? ? Full Name []:
? ? ? ? Room Number []:
? ? ? ? Work Phone []:
? ? ? ? Home Phone []:
? ? ? ? Other []:
Isthe information correct? [Y/n] y
然后把git用戶加入sudo組,切換到git用戶,那么當前目錄就是/home/git
$ sudo? usermod -aG sudo git
$ su - git
?先切換到非系統(tǒng)盤,既然是重要的代碼數(shù)據(jù),那么就不要放在默認的C盤,因為Ubuntu的用戶目錄是在系統(tǒng)盤下的。
比如我放在F盤的gitRepo目錄,然后初始化一個空的倉庫 (例如smartlight.git)
$ cd /mnt/f
git@DESKTOP-JF56RKP:/mnt/f$ sudo mkdir gitRepo
git@DESKTOP-JF56RKP:/mnt/f$ cd gitRepo
git@DESKTOP-JF56RKP:/mnt/f/gitRepo$ sudo git init --bare smartlight.git
[sudo] passwordforgit:
Initialized empty Git repositoryin/mnt/f/gitRepo/smartlight.git/
更改目錄所有者
sudochown-Rgit:gitsmartlight.git
創(chuàng)建一個用戶主目錄下的.ssh文件夾并切換到這個文件夾?
$ cd ~
$ mkdir .ssh
$ cd .ssh
收集所有需要登錄的用戶的公鑰(id_rsa.pub)文件,把所有公鑰導入到/home/git/.ssh/authorized_keys文件內(nèi),一行一個。如果沒有公鑰,那么在bash中可以直接創(chuàng)建:
$ ssh-keygen -t rsa? -C"youremail@example.com"
然后把 id_rsa.pub文件復(fù)制為~/.ssh/authorized_keys文件?,更改其權(quán)限為600
$ cp -a ./id_rsa.pub /home/git/.ssh/authorized_keys
$ sudo chmod600/home/git/.ssh/authorized_keys
id_rsa文件則復(fù)制到客戶端那里。
以下是SSH Server服務(wù)器端設(shè)置:
默認情況下,安裝了win10的Ubuntu子系統(tǒng)以后,Ubuntu 的SSH Server默認已經(jīng)啟動了,如果沒有那么需要安裝一下:
sudo aptinstallopenssh-server
修改配置
sudo nano /etc/ssh/sshd_config
主要是以下幾行,Port 默認為22,但是它會和Win10自帶的Open SSH Server沖突,所以需要一個新的端口號,比如888(我沒有找到停用windows默認ssh服務(wù)器或者更改其端口的方法),其中 PasswordAuthentication no 這一行可以先用默認的yes,等到測試成功了,再改為no,否則如果你是遠程的機器沒配置好然后登錄不上,又沒有別的辦法進入shell,那就杯具了:
Port888
StrictModesno
PubkeyAuthentication yes
AuthorizedKeysFile? ? ? .ssh/authorized_keys
PasswordAuthenticationno
修改完畢重啟sshd服務(wù)
$ sudo service ssh restart
可能會提示:
Command'service'isavailablein'/usr/sbin/service'
The command couldnotbe located because'/usr/sbin'isnotincludedinthe PATH environment variable.
Thisismost likely caused by the lackofadministrative privileges associatedwithyour user account.
把 usr/sbin/加入當前用戶的bashrc路徑即可:
$nano ~/.bashrc
添加一行
exportPATH=/usr/sbin:$PATH
然后source使其生效
$source ~/.bashrc
然后再次重啟服務(wù)
$ sudo service ssh restart
然后還要在Win10 防火墻中建立一個入站規(guī)則,打開888端口,先點擊右下角任務(wù)欄的盾牌,彈出的對話框中選擇 “防火墻和網(wǎng)絡(luò)保護”- “高級設(shè)置”
然后點擊“入站規(guī)則”-“新建規(guī)則”
選擇端口
然后選擇 “TCP”-“特定本地端口”,輸入888
選擇“允許連接”
視情況勾選何時應(yīng)用規(guī)則,作為家里的nas,我都選了。?
然后輸入名稱和描述
macOS用戶:
復(fù)制id_rsa到~/.ssh/目錄下,配置/etc/ssh/ssh_config,添加一個Host,例如我的Server是nas,ip地址為192.168.1.234:
? Host nas
HostName192.168.1.234
? ? ? ? User git
Port888
IdentityFile ~/.ssh/id_rsa
此時使用 ssh nas 即可使用ssh登錄nas上的ssh server了。
win10用戶:
a) Windows Ubuntu bash環(huán)境下,設(shè)置參考macOS用戶。
b) Windows命令行下(cmd或power shell),輸入ssh -V查看是否安裝了OpenSSH客戶端。我的win10專業(yè)版已經(jīng)默認安裝了OpenSSH客戶端。
C:\Users\simonliu>ssh-V
OpenSSH_for_Windows_7.7p1,LibreSSL2.6.5
然后同樣在當前用戶目錄(C:\Users\simonliu>)下創(chuàng)建.ssh文件夾,將id_rsa復(fù)制到該文件夾下,并且創(chuàng)建一個名為config的文件(無后綴名),文件內(nèi)容(注意最后一行需要修改為你的文件實際絕對路徑)。因為我的Win10就是NAS本機,所以ip地址改為127.0.0.1或者localhost均可,你的具體情況具體分析喲。
? Host nas
? ? ? ? HostName ? ? ? ?localhost
? ? ? ? User git
Port888
IdentityFile C:/Users/simonliu/.ssh/id_rsa
然后運行ssh-agent?
C:\Users\simonliu\.ssh>ssh-agent
注意:
如果是Win10 1803版本,默認關(guān)閉了ssh-agent服務(wù),運行ssh-agent可能會提示:
unable tostartssh-agentservice,error:1058
解決方法:在左下角快速搜索欄中輸入“Service”,打開服務(wù)對話框
然后雙擊OpenSSH Authentication Agent服務(wù),將其改為“自動”即可。
然后添加密鑰。
C:\Users\simonliu\.ssh>ssh-addid_rsa
如果生成密鑰的時候設(shè)置了密碼,這時需要輸入密碼?
Enter passphraseforid_rsa:
Identity added: id_rsa (id_rsa)
但是這只對一個shell的session有效,當你重啟shell的一個新的session,就需要重新輸入密碼。如果你想一勞永逸,那么請看另外一篇博文,按照那篇博文設(shè)置之后,每次重啟只需要輸入一次密碼即可,對新的shell session有效。
4. Git倉庫的推送和克隆,實現(xiàn)win10和macOS源碼同步
現(xiàn)在我的應(yīng)用場景是:
i) nas 的Win10 Unbuntu子系統(tǒng)作為Git服務(wù)器,同時又是開發(fā)機,最初的源碼都在nas上進行本地git版本管理。
ii) macOS剛搭建好了編譯環(huán)境,但是沒有源碼,所以需要Git服務(wù)器進行版本管理和同步。
現(xiàn)在需要做兩件事情:
a) 將nas每個項目源碼的所有分支push到nas的Ubuntu Git server上
b) 在macOS將所有分支全部下載下來。
4.1?將nas每個項目源碼的所有分支push到nas的Ubuntu git server上
? ? ? ? 前面添加好了ssh-key以后,不論是在cmd命令行窗口,還是power shell,或者Visual Studio Code的Terminal窗口,都可以通過如下方式把一個項目的所有分支推送到Git Server的遠程倉庫上,我們前面已經(jīng)初始化了一個倉庫,位于?/mnt/f/gitRepo/smartlight.git/ 目錄下。
那么本地先切換到smartlight的源碼所在目錄(例如 E:\Documents\Eclipseworkspace\smartlight),因為已經(jīng)進行了git版本管理,所以需要先添加遠程路徑
E:\Documents\Eclipseworkspace\smartlight>git remoteaddorigin ssh://git@nas/mnt/f/gitRepo/smartlight.git
然后一個命令即可將所有分支和標簽推送過去:
E:\Documents\Eclipseworkspace\smartlight>gitpush--all origin
Option:如果你加入一個參數(shù) -u,
gitpush--all origin -u
那么將會自動進行跟蹤將來如果修改了多個分支,將來只需要git push就可以推送所有分支了。
gitpush
4.2 macOS 或者其他新機器獲取Git服務(wù)器上的全部分支
注意,簡單使用git clone 理論上已經(jīng)獲取遠程的所有分支,但是如果你此時輸入 git branch -a ,只能看到本地的master分支和remote的所有分支,如果你要在本地顯示每個分支,需要分別checkout到相應(yīng)的同名分支上。很遺憾git沒有提供一個內(nèi)置的功能讓你一次性做這個事情,所以需要創(chuàng)建一個腳本。(以本人的macOS的zsh shell為例)。
4.2.1. 首先,在shell profile (~/.zshrc)里面建立一個函數(shù)gclone(),方便將來使用,使用函數(shù)是因為通常bash里的alias不支持傳遞參數(shù):
functiongclone(){
gitclonessh://git@nas/mnt/f/gitRepo/$1.git
}
?4.2.2. 其次,source 使其生效。
>source~/.zshrc
4.2.3. 然后,在~/目錄創(chuàng)建一個腳本gpa.sh (gpa是git pull all的縮寫),內(nèi)容是
#!/bin/zsh
git checkout master ;
remote=origin ;
forbrnamein` git branch -r | grep$remote| grep -v master | grep -v HEAD | awk'{gsub(/^[^\/]+\//,"",$1); print $1}'`;
do
git branch -D$brname;
git checkout -b$brname$remote/$brname;
done;
git checkout master
4.2.4. 給gpa.sh添加執(zhí)行權(quán)限:
>chmod+x~/gpa.sh
4.2.5. 現(xiàn)在開始克隆遠程倉庫,輸入 gclone smartlight ,
這個函數(shù)命令相當于?git clone ssh://git@nas/mnt/f/gitRepo/smartlight.git?
>gclone smartlight
Cloning into'smartlight'...
remote: Counting objects: 232,done.
remote: Compressing objects: 100% (177/177),done.
remote: Total 232 (delta 37), reused 232 (delta 37)
Receiving objects: 100% (232/232), 8.08 MiB | 4.90 MiB/s,done.
Resolving deltas: 100% (37/37),done.
4.2.6 然后切換到這個目錄
>cdsmartlight
4.2.7 運行g(shù)pa.sh即可
>gpa.sh
中間踩過好多坑,現(xiàn)在大致說明一下:
1. Ubuntu無法使用SSH服務(wù)器默認22端口。因為Ubuntu和Win10兩個系統(tǒng)都存在Open SSH Server服務(wù),所以默認22端口被Win占用,折騰了好久才發(fā)現(xiàn)這個問題,改了Ubuntu的SSH端口為888才能連上。在入站規(guī)則里面默認有兩個SSHD(TCP/UDP)的規(guī)則,居然是監(jiān)聽所有端口?還沒法改?這是什么鬼。以后有空再研究吧。
2. 證書登錄 Permission denied (publickey)錯誤,這個錯誤的可能性有很多,比如證書復(fù)制有問題,authorized_keys文件權(quán)限沒有改為600等等。我在mac下折騰了很久登錄不上,后來發(fā)現(xiàn)默認終端窗口可以,iTerm2不行,關(guān)掉iTerm2窗口以后重新打開又可以了,在這里來回折騰服務(wù)器設(shè)置浪費了2個小時。最后發(fā)現(xiàn)是ssh_config文件里面的id_rsa文件路徑使用了相對路徑,所以切換到別的目錄的時候,是無法找到密鑰文件登錄成功的。默認終端窗口或者iTerm2新開的窗口,默認路徑都是用戶的主目錄,所以能正確找到密鑰文件。后來win下面的配置文件改為絕對路徑,mac下的前面加上一個~(即用戶主目錄)就好了。
3. Windows下每次登陸或者訪問Git Server都要求輸入密碼。只需要啟用OpenSSH Authentication Agent服務(wù),通過ssh-agent添加密鑰即可。最開始用了ssh-agent命令,結(jié)果添加了key每次git push還要輸入密碼,然而ssh nas 這個命令又不需要。后來才發(fā)現(xiàn)需要運行start-ssh-agent才可以。但是如果要更好地解決輸入密碼問題,需要參看我的另外一篇博文Win10 cmd命令行,Powershell,Linux子系統(tǒng)Ubuntu bash自動啟動ssh-agent?。
4.?雖然 git clone 有一個 --mirror 參數(shù),但是這個參數(shù)會讓你完全復(fù)制 git server 的整個目錄結(jié)構(gòu),它并不是你原先的工作目錄結(jié)構(gòu)。
作為本地的nas機器,其實沒有太大必要。但是如果是遠程機器,那么最好進行設(shè)置。
1. 在密鑰生成之后可以把git的bash禁掉,可以通過編輯?/etc/passwd?文件完成。
git:x:1003:1003::/home/git:/bin/bash
改為
git:x:1003:1003::/home/git:/usr/bin/git-shell
這樣,git用戶可以正常通過ssh使用git,但無法登錄shell,因為我們?yōu)間it用戶指定的git-shell每次一登錄就自動退出。
2. 多用戶權(quán)限管理,這個不在本文討論了。