Win10 Ubuntu子系統(tǒng)設(shè)置Git服務(wù)器和SSH Server (轉(zhuǎn))

本文鏈接: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)

1. 設(shè)置Git服務(wù)器

首先右鍵點擊開始按鈕-”運行“-"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

2. SSH Server證書登錄設(shè)置

創(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,我都選了。?

然后輸入名稱和描述


3. 客戶端設(shè)置

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

5. 我踩過的坑

中間踩過好多坑,現(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)。

6. 進一步的安全設(shè)置

作為本地的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)限管理,這個不在本文討論了。

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

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

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