Git介紹及基本概念
- 分布式版本控制系統(tǒng)
Git是一個分布式版本控制系統(tǒng),每個本地保留遠(yuǎn)程倉庫的完整副本,在本地可以進(jìn)行任何版本控制操作,比如修改,提交,創(chuàng)建分支,合并分支,回退等。需要時才推送到遠(yuǎn)程倉庫。
- Git文件保存
Git對每次提交,有變化的文件都會整個文件存儲起來,而不是像其它版本控制系統(tǒng),比如cvs,svn,perforce等存儲的是文件的差異(#直接記錄快照,而非差異比較)部分。但是git有package機(jī)制,適當(dāng)?shù)臅r候會自動運(yùn)行g(shù)it gc命令(也可以手動運(yùn)行)對文件進(jìn)行差異存儲。當(dāng)然為了節(jié)約空間,也會進(jìn)行壓縮。這種方式在分支方面會帶來很大的好處,Git的分支,其實本質(zhì)上僅僅是指向提交對象的可變指針。
- Git對數(shù)據(jù)的引用
Git中所有數(shù)據(jù),包括提交,目錄,文件等,在存儲前都計算校驗和,然后以校驗和來引用,這個校驗和相當(dāng)于指針。Git用以計算校驗和的機(jī)制叫做 SHA-1 散列(hash,哈希),這是一個由 40 個十六進(jìn)制字符(0-9 和 a-f)組成字符串。 SHA-1 哈??雌饋硎沁@樣:24b9da6552252987aa493b52f8696cd6d3b00373。
- Git對象
Git有4種對象,blob對象(通常是文件),樹(tree)對象(通常是目錄),提交(commit)對象和標(biāo)簽(tag)對象。當(dāng)使用 git commit 進(jìn)行提交操作時,Git會先計算每一個文件的校驗和,在Git倉庫中保存為blob對象,然后計算每一個子目錄的校驗和,保存為樹對象,隨后,Git便會創(chuàng)建一個提交對象,它包含提交信息(比如提交者名字,郵件,提交時間等),指向這個樹對象(項目根目錄)的指針和父提交對象(第一次提交無父提交對象)。如此一來,Git 就可以追蹤任何對象。標(biāo)簽對象實際上是一個加了標(biāo)簽信息的提交對象,它像是一個永不移動的分支引用——永遠(yuǎn)指向同一個提交對象,只不過給這個提交對象加上一個更友好的名字罷了。
Blob對象
一個blob通常用來存儲文件的內(nèi)容.

你可以使用git show命令來查看一個blob對象里的內(nèi)容。
Tree對象
一個tree對象有一串(bunch)指向blob對象或是其它tree對象的指針,它一般用來表示內(nèi)容之間的目錄層次關(guān)系。

git show命令還可以用來查看tree對象,但是git ls-tree能讓你看到更多的細(xì)節(jié)。
Commit對象
"commit對象"指向一個"tree對象", 并且?guī)в邢嚓P(guān)的描述信息.

你可以用 --pretty=raw 參數(shù)來配合git show或 git log 去查看某個提交(commit):
Tag對象

你可以用 git cat-file命令來查看。
如果我們一個小項目, 有如下的目錄結(jié)構(gòu):
$ tree
.
|-- README
|-- lib
|-- inc
|-- tricks.rb
|-- mylib.rb
2 directories, 3 files
如果我們把它提交(commit)到一個Git倉庫中, 在Git中它們也許看起來就如下圖:

你可以看到: 每個目錄都創(chuàng)建了 tree對象 (包括根目錄), 每個文件都創(chuàng)建了一個對應(yīng)的 blob對象 . 最后有一個 commit對象來指向根tree對象(root of trees), 這樣我們就可以追蹤項目每一項提交內(nèi)容.
5.Git目錄
這個叫'.git'的目錄在項目的根目錄下,存儲所有歷史和元信息,包括所有的對象(commits,trees,blobs,tags)。如下:
|-- HEAD # 這個git項目當(dāng)前處在哪個分支里
|-- config # 項目的配置信息,git config命令會改動它
|-- description # 項目的描述信息
|-- hooks/ # 系統(tǒng)默認(rèn)鉤子腳本目錄
|-- index # 索引文件
|-- logs/ # 各個refs的歷史信息
|-- objects/ # Git本地倉庫的所有對象 (commits, trees, blobs, tags)
|-- refs/ # 標(biāo)識你項目里的每個分支指向了哪個提交(commit)。
6.工作目錄
Git的 '工作目錄' 存儲著你現(xiàn)在簽出(checkout)來用來編輯的文件。當(dāng)你在項目的不同分支間切換時, 工作目錄里的文件經(jīng)常會被替換和刪除。所有歷史信息都保存在 'Git目錄'中,工作目錄只用來臨時保存簽出(checkout) 文件的地方, 你可以編輯工作目錄的文件直到下次提交(commit)為止。
7.Git索引
Git索引(index)是一個在你的工作目錄和項目倉庫間的暫存區(qū)(staging area). 有了它, 你可以把許多內(nèi)容的修改一起提交(commit). 如果你創(chuàng)建了一個提交(commit), 那么提交的是當(dāng)前索引(index)里的內(nèi)容, 而不是工作目錄中的內(nèi)容.

Git基本應(yīng)用
- Git 配置
使用Git的第一件事就是設(shè)置你的名字和email,這些就是你在提交commit時的簽名。
$ git config --global user.name "Administator"
$git config --global user.email "gitlab@niuer.tech"
執(zhí)行了上面的命令后,會在你的主目錄(home directory)建立一個叫 ~/.gitconfig 的文件. 內(nèi)容一般像下面這樣:
[user]
name = Administator
email = gitlab@niuer.tech
如果你想使項目里的某個值與前面的全局設(shè)置有區(qū)別(例如把私人郵箱地址改為工作郵箱);你可以在項目中使用git config 命令不帶 --global 選項來設(shè)置. 這會在你項目目錄下的 .git/config 文件增加一節(jié)[user]內(nèi)容(如上所示).
$ git config --list ---查看當(dāng)前config。
- 建立倉庫
$ git init
$ git clone git@git.niuer.tech:root/training.git
- 提交到Git倉庫
先修改或者創(chuàng)建文件file1,file2,然后添加file1,file2到暫存區(qū)(index):
$ git add file1 file2
也可以添加所有文件到暫存區(qū):
$ git add .
如果不想提交file2,可以從暫存區(qū)移除它:
$ git rm --cached file2
(有了第一次提交之后,可以git reset file2 替代git rm --cached file2)
最后提交到git倉庫:
$ git commit -m 'my first commit'
commit前可以用git status查看狀態(tài):
$ git status
- 回退提交
有2種方式:
$ git reset [--soft | --mixed | --hard]
--mixed
默認(rèn)方式,會保留源碼,只是將git commit和index信息回退到了某個提交(版本)(修改.git/HEAD的內(nèi)容),如果還需要提交,先add再直接commit,或者commit -a
--soft
保留源碼,只回退到commit 信息到某個提交(版本),不涉及index的回退,如果還需要提交,直接commit即可.
--hard
不保留源碼, 源碼和commit,index 都會回退到某個提交(版本)。這種方式比較危險,reset commit_id相當(dāng)于把commit_id之后的提交刪除,git log里都不會出現(xiàn)(當(dāng)然git reflog里會有,所以也能undo reset)。
舉例:
撤銷到上一個版本:
$ git reset HEAD~1
撤銷到任意一個版本:
$ git log ---查看提交,然后
$ git reset xxx ---恢復(fù)到版本xxx或者git reset HEAD~n ---恢復(fù)到倒數(shù)第n個提交。
當(dāng)你push到遠(yuǎn)程倉庫之后再reset,修改文件再commit,沒問題,可是push的時候問題就來了,這個時候相當(dāng)于有人在遠(yuǎn)程倉庫里已經(jīng)push了你上次的提交,必然會產(chǎn)生沖突,你就需要解決沖突才能push。
- 清除/廢棄提交
$ git revert
git revert用一個新提交來清除/廢棄某些或者某個歷史提交(比如a123)所做的任何修改,歷史提交a123未修改的文件不會受影響,但是如果a123之后修改了a123修改的文件,那么就需要合并了。執(zhí)行revert命令時要求工作樹必須是干凈的。
git reset 跟git revert有時候容易搞混淆,其實這兩個命令區(qū)別還是挺大的,前者回退/回滾到某個提交(版本),某個提交之后的提交都不要了;而后者是清除/廢棄某些/某個提交,就是說某些/某個提交不要了,但是之后的提交還要的。
- [忽略文件]
在工作區(qū)根目錄創(chuàng)建一個叫.gitignore的文件,把不需要git來管理的文件名放在里面,可以使用通配符格式。
格式規(guī)范如下:
所有空行或者以 # 開頭的行都會被 Git 忽略。
可以使用標(biāo)準(zhǔn)的 glob 模式匹配。
匹配模式可以以(/)開頭防止遞歸。
匹配模式可以以(/)結(jié)尾指定目錄。
要忽略指定模式以外的文件或目錄,可以在模式前加上驚嘆號(!)取反。
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達(dá)式。 星號()匹配零個或多個任意字符;[abc] 匹配任何一個列在方括號中的字符(這個例子要么匹配一個 a,要么匹配一個 b,要么匹配一個 c);問號(?)只匹配一個任意字符;如果在方括號中使用短劃線分隔兩個字符,表示所有在這兩個字符范圍內(nèi)的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的數(shù)字)。 使用兩個星號() 表示匹配任意中間目錄,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等。
- 分支
7.1分支介紹
假設(shè)我們有三個文件:README test.rb LICENSE第一次提交到了倉庫,現(xiàn)在,Git 倉庫中有五個對象:三個 blob 對象(保存著文件快照)、一個樹對象(記錄著目錄結(jié)構(gòu)和 blob 對象索引)以及一個提交對象(包含著指向前述樹對象的指針和所有提交信息):

我們做了2次修改后又提交了2次,這時候提交對象看起來就是下面這個樣子:

分支是這樣:

用命令
git checkout testing
切換分支到testing之后:

git commit -a -m 'made a change'

切換回master分支:
$ git checkout master

git commit -a -m 'made other changes'

7.2創(chuàng)建分支
從當(dāng)前分支創(chuàng)建dev分支:
git branch
顯示所有分支,包括遠(yuǎn)程分支:
git checkout dev
7.3合并分支
假設(shè)遠(yuǎn)程分支"origin"已經(jīng)有了2個提交,如圖

現(xiàn)在我們在這個分支做一些修改,然后生成兩個提交(commit),但是與此同時,有些人也在"origin"分支上做了一些修改并且做了提交了. 這就意味著"origin"和"mywork"這兩個分支各自"前進(jìn)"了,它們之間"分叉"了。

正常合并:
git merge origin
$ git commit -a

變基(rebase)合并:
git rebase origin

$ git merge origin

解決合并中的沖突
如果你修改了某個文件,提交之前有人修改該個文件,就會有沖突,執(zhí)行自動合就不會成功,git會在索引和工作樹里設(shè)置一個特殊的狀態(tài), 提示你如何解決合并中出現(xiàn)的沖突。
有沖突(conflicts)的文件會保存在索引中,除非你解決了問題了并且更新了索引,否則執(zhí)行 git commit都會失敗:
$ git commit
file.txt: needs merge
如果執(zhí)行 git status會顯示這些文件沒有合并(unmerged),這些有沖突的文件里面會添加像下面的沖突標(biāo)識符:
<<<<<<< HEAD:file.txt
Hello world
=======
Goodbye
>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt
你所需要的做是就是編輯解決沖突,(接著把沖突標(biāo)識符刪掉),再執(zhí)行下面的命令:
$ git add file.txt
$ git commit 或者
$ git rebase --continue
如果有了沖突,想取消合并
$ git merge --abort 或者
$ git rebase --abort
如果dev分支不要了,可以刪除:
$ git branch -d dev
刪除遠(yuǎn)端分支:
$ git push origin --delete dev
查看已合并分支:
$ git branch --merged
查看未合并分支:
$ git branch --no-merged
- 打標(biāo)簽
打一個輕量標(biāo)簽:
$ git tag v1.0 [commit_id]
打一個附注標(biāo)簽(annotated):
$ git tag -a v2.0 -m "version 2.0" [commit_id]
顯示標(biāo)簽:
$ git tag
推送標(biāo)簽到遠(yuǎn)程倉庫:
$ git push origin v2.0
- 比較
比較工作目錄(Working tree)和暫存區(qū)域快照(index)之間的差異,也就是修改之后還沒有暫存起來的變化內(nèi)容:
$ git diff
比較已經(jīng)暫存起來但是還沒提交的差異,也就是下一次commit時會提交到HEAD的內(nèi)容:
$ git diff --cached
顯示工作版本(Working tree)和HEAD(上次提交)的差異:
$ git diff HEAD
比較dev最新提交跟master最新提交之間的差異:
$ git diff master dev or git diff master..dev
比較dev從master分支分開以來的差異,就是dev與分開點(diǎn)的差異:
$ git diff master...dev
比較任意兩個提交之間的差異
$ git diff fabca703f9682cbc6 2dabcf99b863c46b4f
比較dev最新提交跟master最新提交之間的關(guān)于文件test.txt的差異:
$ git diff master..dev test.txt
- 儲藏
在工作區(qū)修改了文件,暫時不想提交,現(xiàn)在又想要切換分支,這時候就需要把修改儲藏起來:
$ git stash
切換回分支過后,把儲藏起來的文件取回工作區(qū):
$ git stash pop
- 徹底刪除文件
比如我現(xiàn)在的目錄是這樣:

做幾個提交如下:
$ git add file1
$ git commit -m 'add file1'
$ git add test.tar
$ git commit -m 'add the big tar file test.tar'
$ git add file2
$ git commit -m 'add file2'
$ git rm --cached test.tar
$ git commit -m 'remove the big tar file test.tar'
$ git branch dev
$ git checkout dev
$ git add m.sh
$ git commit -m 'add m.sh'
我們看一下完整的git log以便和徹底刪除文件之后的比較:
$ git log
commit 67d712fcd4c3e9b02bda773151def4421657a160
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
add m.sh
commit 52ec9d47f010d7132fe3cbcc5c53dda5aed129e0
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
remove the big tar file test.tar
commit e007b16860cd55470e5c57ebccf0e2e721d81530
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
add file2
commit a6f1b49c37c4c724e579088d28fce711f229c028
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
add the big tar file test.tar
commit 62c6d0887e87da7d5c17aa705d933adc0a9c0507
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:09 2019 +0800
add file1
$ git checkout master
$ git log
commit 52ec9d47f010d7132fe3cbcc5c53dda5aed129e0
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
remove the big tar file test.tar
commit e007b16860cd55470e5c57ebccf0e2e721d81530
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
add file2
commit a6f1b49c37c4c724e579088d28fce711f229c028
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
add the big tar file test.tar
commit 62c6d0887e87da7d5c17aa705d933adc0a9c0507
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:09 2019 +0800
add file1
我們看看倉庫大?。?/p>
$ git count-objects -v
count: 11
size: 221428
in-pack: 0
packs: 0
size-pack: 0
prune-packable: 0
garbage: 0
size-garbage: 0
看到?jīng)],雖然我們刪除了它,其實它還是在里面的,每次提交都要對它進(jìn)行SHA-1計算,每次clone都會下載它,雖然我們根本不需要它。
接下來我們要徹底刪除它:
先要找到添加這個大文件的提交:
$ git log --oneline --branches -- test.tar
52ec9d4 remove the big tar file test.tar
a6f1b49 add the big tar file test.tar
這里是a6f1b49,
然后,你必須重寫 a6f1b49 提交及其之后的所有提交才能從Git歷史中完全移除這個文件。為什么要重寫a6f1b49 之后的所有提交呢?回顧一下前面講的git對象,每次提交都要計算各個對象的SHA-1值,既然一個文件徹底移除了,那么包含這個文件的樹對象及其父樹對象,提交對象及其子提交對象都要重新計算。
$ git filter-branch --index-filter 'git rm --ignore-unmatch --cached test.tar' --prune-empty -- a6f1b49 HEAD --all
Rewrite a6f1b49c37c4c724e579088d28fce711f229c028 (2/5)rm 'test.tar'
Rewrite e007b16860cd55470e5c57ebccf0e2e721d81530 (3/5)rm 'test.tar'
Rewrite 67d712fcd4c3e9b02bda773151def4421657a160 (5/5)
Ref 'refs/heads/master' was rewritten
Ref 'refs/heads/dev' was rewritten
WARNING: Ref 'refs/heads/master' is unchanged
解釋下,這條命令的意思是在index(cached)里刪除test.tar,然后在branch里刪除test.tar。這里要注意的是符號" -- "起分隔filter-branch選項和rev-list選項的作用,所以這里的--all是指rev-list的選項--all,就是refs/ 下面的所有refs,可以理解為所有分支。
看一下log:
$ git log
commit e92badb3ba49c072fdcd234d65f49d8dd9dc04da
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
add file2
commit 62c6d0887e87da7d5c17aa705d933adc0a9c0507
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:09 2019 +0800
add file1
看到?jīng)],從添加這個大文件開始之后的提交全部被改寫了。
看一下dev分支:
$ git checkout dev
$ git log
commit 41316c577c29473f73aea323bbc8e539cd500aa3
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
add m.sh
commit e92badb3ba49c072fdcd234d65f49d8dd9dc04da
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:20 2019 +0800
add file2
commit 62c6d0887e87da7d5c17aa705d933adc0a9c0507
Author: Administrator support@niuer.tech
Date: Wed Aug 21 15:24:09 2019 +0800
add file1
讓我們看看節(jié)省了多少空間:
$ git count-objects -v
count: 16
size: 221448
in-pack: 0
packs: 0
size-pack: 0
prune-packable: 0
garbage: 0
size-garbage: 0
啊?!沒有節(jié)省空間嘛……
因為還有引用指向這個大文件,你需要手動刪除以前的引用:
$ rm -Rf .git/refs/original
更新本地log:
$ git reflog expire --expire=now --all
如果有遠(yuǎn)程引用,刪除它們,比如:
$ git remote rm origin
再做一次垃圾回收:
$git gc --prune=now
這下大文件就徹底永久的刪除了:
$ git count-objects -v
count: 0
size: 0
in-pack: 9
packs: 1
size-pack: 5
prune-packable: 0
garbage: 0
size-garbage: 0
如果你不知道某個大文件在哪里,可以通過下面的命令查找大文件的SHA-1值(第一列)和文件大小(第三列):
$ git gc
$ git verify-pack -v .git/objects/pack/pack-0b512708d645a6b5f15891de74b68fac1f6abd1b.idx | sort -k 3 -n
chain length = 1: 2 objects
.git/objects/pack/pack-0b512708d645a6b5f15891de74b68fac1f6abd1b.pack: ok
b18797efe0949a25dff3fec9b58760f3cf86a793 tree 4 14 719 1 71cdad7926263a6b82c8dcc189ab086f6e50dac1
26a46ea3ec23a452abd49d6461a0d97f26c3f3e7 blob 7 18 4364 1 f3362d9be6f76acff3a8de6fdf04b7b6a6cd8b6b
non delta: 9 objects
33ba55b0966d37bd4b396f640acdf28c7631b1c0 tree 33 44 226571881
57c286b455dc3cf998c36b18c7175b6734b19d5a tree 69 77 4382
71cdad7926263a6b82c8dcc189ab086f6e50dac1 tree 102 103 616
fa6d0e110b78152883a3d6dd28eb4f94ca32389c commit 176 122 494
7a333477d059486728ac43c41f9b5a899c6a3f26 commit 224 151 343
7e8910d778a62f8a315476840e289ef5e90b7dc8 commit 244 164 179
acbe66fd2cf05b050fe39e4a999e38fffd078dec commit 247 167 12
f3362d9be6f76acff3a8de6fdf04b7b6a6cd8b6b blob 7606 3631 733
f2595ad951ee37ffc07c6df054d93fe5b09a3c28 blob 230195200 226567422 4459
然后:
$ git rev-list --objects --all | grep f2595ad951e
f2595ad951ee37ffc07c6df054d93fe5b09a3c28 test.tar
文件這個操作對提交歷史的修改是破壞性的,一般由管理員完成。管理員先通知所有開發(fā)人員push他們的提交,之后讓他們不要再做任何操作。自己做好備份,然后才執(zhí)行這個操作,最后$ git push --all origin
- 遠(yuǎn)程倉庫
查看遠(yuǎn)程倉庫配置:
$ git remote -v
添加遠(yuǎn)程倉庫鏈接tr:
$ git remote add tr git@git.niuer.tech:root/training.git
刪除遠(yuǎn)程倉庫鏈接tr:
$ git remote rm tr
查看遠(yuǎn)程倉庫鏈接tr:
$ git remote show tr
重命名tr為training:
$ git remote rename tr training
從遠(yuǎn)程倉庫tr拉取分支dev并合并到當(dāng)前分支
$ git pull tr dev
git fetch 跟git pull區(qū)別:
git pull用remote倉庫更新本地倉庫(merge),并更新本地分支指針比如.git/refs/heads/master和本地保存的remote分支指針比如.git/refs/remotes/origin/master;
git fetch只更新.git/FETCH_HEAD和本地保存的remote分支指針比如.git/refs/remotes/origin/master,并不跟新本地倉庫。
所以,git pull=git fetch + git merge FETCH_HEAD

Git 權(quán)限控制原理
Git雖說很強(qiáng)大,但是Git也有一個很“嚴(yán)重”的問題,那就是沒有權(quán)限控制功能。Git的創(chuàng)建是作為開源社區(qū)的代碼版本管理工具而存在的,但當(dāng)我們把Git引入到團(tuán)隊內(nèi)部的開發(fā)流程中后就會發(fā)現(xiàn)沒有權(quán)限控制的Git無法保護(hù)代碼的安全。幸好還有SSH。由于Git的主流連接方式是SSH連接,因此當(dāng)我們試圖控制一個Git中心庫權(quán)限的時候,可以通過控制SSH登錄用戶的權(quán)限來間接的達(dá)到目的。那如何控制SSH的用戶權(quán)限呢?既然我們SSH到中心庫的時候用的可能都是git用戶(Linux的用戶),又如何區(qū)分到底真是用戶是誰呢?這里就不得不說SSH的公私鑰模式,當(dāng)我們將某一個用戶生成的公鑰添加到git用戶的 ~/.ssh/authorized_keys 文件后,以git用戶身份SSH連接到Git 中心庫時可以免去輸入密碼的步驟。而Git權(quán)限控制的關(guān)鍵環(huán)節(jié)就在這個authorized_keys文件中。
一般典型的authorized_keys文件每一行都是一個公鑰串,簡單直接,但其實這個文件可以支持更豐富的SSH連接模式,請看下方的截圖:

很顯然,這里面除了公鑰之外還包括幾個其他的配置:
command:以該公鑰對應(yīng)的私鑰登陸后執(zhí)行的命令
no-xxxxx:表示不支持該模式的連接
最后才是對應(yīng)的公鑰。
這樣配置的話,如果用戶試圖使用SSH默認(rèn)連接方式會得到如下的返回結(jié)果:

這樣可以限制用戶不可以毫無顧忌的連接到Git中心庫進(jìn)而繞過SSH的權(quán)限控制系統(tǒng)。而每次Git的push/pull/clone等操作其實都是一次SSH連接從而激活command命令而執(zhí)行腳本。那么剩下的就好解釋了,腳本接受參數(shù),然后去做用戶權(quán)限的判斷,如果用戶具有權(quán)限那么直接執(zhí)行SSH連接附帶的命令請求,如果沒有權(quán)限直接exit。