• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦>學習電腦>操作系統(tǒng)>Linux教程>

    liunx ssh命令詳解

    時間: 志藝942 分享

      我們將開始學習如何構(gòu)建一個Git服務器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網(wǎng)站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:

      liunx ssh命令詳解

      目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構(gòu)的設計。你可能會覺得這聽起來像“先進的Git技術(shù)”或者“如果你是學霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓,在一些情況下只需要了解一點Linux。分享Git服務

      創(chuàng)建自己的Git服務共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務。它不僅保證你隨時可以訪問你的代碼,它的無限制數(shù)據(jù)存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。

      假如你知道如何使用Git和SSH,那么你已經(jīng)知道如何創(chuàng)建一個Git服務器了。設計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經(jīng)創(chuàng)建了一半服務器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎。

      但是,會有一個小特設。有些計劃你可以構(gòu)建關(guān)于同樣數(shù)量的精心設計的Git服務器,但是可以具有更好擴展性。

      首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻者了,那么你應該為開發(fā)者搭建一個貢獻共享系統(tǒng)平臺。

      假定你有一個可用的服務器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權(quán)登錄,它比密碼登錄更加強大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。

      在你啟用了SSH密鑰認證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認證的用戶的共享用戶賬號:

      1$ su -c 'adduser gituser'

      然后切換到這個用戶,并使用合適的權(quán)限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權(quán)限設置太過于隨意,你自己針對SSH的防護默認就會失效。

      1$ su - gituser

      2$ mkdir .ssh && chmod 700 .ssh

      3$ touch .ssh/authorized_keys

      4$ chmod 600 .ssh/authorized_keys

      authorized_keys 文件里面有所有你賦予其權(quán)限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:

      1$ cat ~/path/to/id_rsa.bob.pub >> \

      2/home/gituser/.ssh/authorized_keys

      當開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務器。

      不過,你并不會真的想讓你的開發(fā)者訪問到服務器,即使只是以gituser用戶來進行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認shell:

      1# grep git-shell /etc/shells || su -c \

      2"echo `which git-shell` >> /etc/shells"

      3# su -c 'usermod -s git-shell gituser'

      現(xiàn)在gituser只能使用SSH來向Git資源庫進行推送和拉取操作,而不能訪問到一個登陸shell。你應該將你自己加入gituser對應的用戶組,在我們的示例服務器中它還是gituser。

      例如:

      1# usermod -a -G gituser seth

      剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務器上跟它進行直接交互(也就是說你不會通過SSH連上服務器然后直接在資源庫中進行操作), 這使其成為了一個基礎的資源庫。如果你想要把服務器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。

      嚴格來說,你并不用使其成為一個基礎資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠程用戶不會被允許向一個活動分支進行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎資源庫不能有活動分支,那就不會有問題發(fā)生了。

      你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權(quán)限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權(quán)限相當?shù)貒栏? 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.

      以root用戶創(chuàng)建一個基礎資源庫:

      1# git init --bare /opt/jupiter.git

      2# chown -R gituser:gituser /opt/jupiter.git

      3# chmod -R 770 /opt/jupiter.git

      現(xiàn)在任何已gituser認證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機上試試看:

      1$ git clone gituser@example.com:/opt/jupiter.git jupiter.clone

      2Cloning into 'jupiter.clone'...

      3Warning: you appear to have cloned an empty repository.

      記?。洪_發(fā)有必須讓他們的公共SSH密鑰導入gituser用戶的 authorized_keys 文件, 或者是擁有服務器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。

      Git鉤子

      運行你自己的Git服務器帶來的一個好處是它提供了Git鉤子。Git托管服務有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。

      這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標準的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。

      可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認情況下,Git附帶了一些范例,但沒有啟用。

      想要運行一個腳本嗎?使用起來很簡單。如果你還沒有Git倉庫的話,首先創(chuàng)建一個。

      1$ mkdir jupiter

      2$ cd jupiter

      3$ git init .

      然后編寫一個"hello world" Git鉤子。由于在工作中我為了傳統(tǒng)支持而使用tcsh,所以我堅持使用它作為我的腳本語言,但你可以自由地選用你喜愛的語言(Bash、Python、Ruby、Perl、Rust、Swift、Go):

      1$ echo "#\!/bin/tcsh" > .git/hooks/post-commit

      2$ echo "echo 'POST-COMMIT SCRIPT TRIGGERED'" > \

      3~/jupiter/.git/hooks/post-commit

      4$ chmod +x ~/jupiter/.git/hooks/post-commit

      現(xiàn)在進行測試:

      1$ echo "hello world" > foo.txt

      2$ git add foo.txt

      3$ git commit -m 'first commit'

      4! POST-COMMIT SCRIPT TRIGGERED

      5[master (root-commit) c8678e0] first commit

      61 file changed, 1 insertion(+)

      7create mode 100644 foo.txt

      這就是你的第一個可以正常運行的Git鉤子。

      著名的推送到web 鉤子

      一個流行的Git鉤子用法是自動推送改變部分到工作生產(chǎn)中的web服務器目錄。這是一個偉大構(gòu)建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內(nèi)容。

      如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應該做的是考慮如何網(wǎng)絡發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。

      Git變量

      每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關(guān)變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細節(jié),也不需要腳本,因為你可以套用現(xiàn)有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。

      Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數(shù)。不同的是,我們不會提供自己入?yún)ⅲ允褂盟鼤r要弄清楚你想要的是什么(參數(shù))。

      編寫一個Git鉤子之前,可以進入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:

      1# class="main">

    liunx ssh命令詳解

    時間: 志藝942 分享

      2#

      我們將開始學習如何構(gòu)建一個Git服務器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網(wǎng)站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:

      liunx ssh命令詳解

      目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構(gòu)的設計。你可能會覺得這聽起來像“先進的Git技術(shù)”或者“如果你是學霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓,在一些情況下只需要了解一點Linux。分享Git服務

      創(chuàng)建自己的Git服務共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務。它不僅保證你隨時可以訪問你的代碼,它的無限制數(shù)據(jù)存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。

      假如你知道如何使用Git和SSH,那么你已經(jīng)知道如何創(chuàng)建一個Git服務器了。設計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經(jīng)創(chuàng)建了一半服務器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎。

      但是,會有一個小特設。有些計劃你可以構(gòu)建關(guān)于同樣數(shù)量的精心設計的Git服務器,但是可以具有更好擴展性。

      首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻者了,那么你應該為開發(fā)者搭建一個貢獻共享系統(tǒng)平臺。

      假定你有一個可用的服務器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權(quán)登錄,它比密碼登錄更加強大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。

      在你啟用了SSH密鑰認證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認證的用戶的共享用戶賬號:

      1$ su -c 'adduser gituser'

      然后切換到這個用戶,并使用合適的權(quán)限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權(quán)限設置太過于隨意,你自己針對SSH的防護默認就會失效。

      1$ su - gituser

      2$ mkdir .ssh && chmod 700 .ssh

      3$ touch .ssh/authorized_keys

      4$ chmod 600 .ssh/authorized_keys

      authorized_keys 文件里面有所有你賦予其權(quán)限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:

      1$ cat ~/path/to/id_rsa.bob.pub >> \

      2/home/gituser/.ssh/authorized_keys

      當開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務器。

      不過,你并不會真的想讓你的開發(fā)者訪問到服務器,即使只是以gituser用戶來進行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認shell:

      1# grep git-shell /etc/shells || su -c \

      2"echo `which git-shell` >> /etc/shells"

      3# su -c 'usermod -s git-shell gituser'

      現(xiàn)在gituser只能使用SSH來向Git資源庫進行推送和拉取操作,而不能訪問到一個登陸shell。你應該將你自己加入gituser對應的用戶組,在我們的示例服務器中它還是gituser。

      例如:

      1# usermod -a -G gituser seth

      剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務器上跟它進行直接交互(也就是說你不會通過SSH連上服務器然后直接在資源庫中進行操作), 這使其成為了一個基礎的資源庫。如果你想要把服務器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。

      嚴格來說,你并不用使其成為一個基礎資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠程用戶不會被允許向一個活動分支進行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎資源庫不能有活動分支,那就不會有問題發(fā)生了。

      你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權(quán)限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權(quán)限相當?shù)貒栏? 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.

      以root用戶創(chuàng)建一個基礎資源庫:

      1# git init --bare /opt/jupiter.git

      2# chown -R gituser:gituser /opt/jupiter.git

      3# chmod -R 770 /opt/jupiter.git

      現(xiàn)在任何已gituser認證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機上試試看:

      1$ git clone gituser@example.com:/opt/jupiter.git jupiter.clone

      2Cloning into 'jupiter.clone'...

      3Warning: you appear to have cloned an empty repository.

      記?。洪_發(fā)有必須讓他們的公共SSH密鑰導入gituser用戶的 authorized_keys 文件, 或者是擁有服務器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。

      Git鉤子

      運行你自己的Git服務器帶來的一個好處是它提供了Git鉤子。Git托管服務有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。

      這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標準的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。

      可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認情況下,Git附帶了一些范例,但沒有啟用。

      想要運行一個腳本嗎?使用起來很簡單。如果你還沒有Git倉庫的話,首先創(chuàng)建一個。

      1$ mkdir jupiter

      2$ cd jupiter

      3$ git init .

      然后編寫一個"hello world" Git鉤子。由于在工作中我為了傳統(tǒng)支持而使用tcsh,所以我堅持使用它作為我的腳本語言,但你可以自由地選用你喜愛的語言(Bash、Python、Ruby、Perl、Rust、Swift、Go):

      1$ echo "#\!/bin/tcsh" > .git/hooks/post-commit

      2$ echo "echo 'POST-COMMIT SCRIPT TRIGGERED'" > \

      3~/jupiter/.git/hooks/post-commit

      4$ chmod +x ~/jupiter/.git/hooks/post-commit

      現(xiàn)在進行測試:

      1$ echo "hello world" > foo.txt

      2$ git add foo.txt

      3$ git commit -m 'first commit'

      4! POST-COMMIT SCRIPT TRIGGERED

      5[master (root-commit) c8678e0] first commit

      61 file changed, 1 insertion(+)

      7create mode 100644 foo.txt

      這就是你的第一個可以正常運行的Git鉤子。

      著名的推送到web 鉤子

      一個流行的Git鉤子用法是自動推送改變部分到工作生產(chǎn)中的web服務器目錄。這是一個偉大構(gòu)建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內(nèi)容。

      如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應該做的是考慮如何網(wǎng)絡發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。

      Git變量

      每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關(guān)變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細節(jié),也不需要腳本,因為你可以套用現(xiàn)有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。

      Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數(shù)。不同的是,我們不會提供自己入?yún)?,所以使用它時要弄清楚你想要的是什么(參數(shù))。

      編寫一個Git鉤子之前,可以進入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:

      1# $1 -- Name of the remote to which the push is being done

      2# $2 -- URL to which the push is being done

      3# If pushing without using a named remote those arguments will be equal.

      4#

      5# Information about commit is supplied as lines

      6# to the standard input in this form:

      7#

      并非所有的范例寫的都那么清晰,文檔對于什么鉤子需要什么變量的說明還有些不足(除非你要閱讀Git的源代碼),不過若有疑問,你可以通過trials of other users進行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。

      分支檢測范例

      我發(fā)現(xiàn)在實際的生產(chǎn)中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務。

      首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務器上的遠程倉庫最有意義,而不是作為你的本地倉庫的一部分。

      我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:

      1#!/bin/tcsh

      2foreach arg ( $< )

      3set argv = ( $arg )

      4set refname = $1

      5end

      for循環(huán)讀第一個參數(shù)($1),然后再次循環(huán)讀入第二個參數(shù)值($2),接著用第三個參數(shù)($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數(shù)組。但是,這里使用的是tcsh,并且變量順序是預先定義好的,這樣做要安全些。

      當有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:

      1set branch = `git rev-parse --symbolic --abbrev-ref $refname`

      2echo $branch #DEBUG

      這時我們可以將分支名與基于動作名的關(guān)鍵字進行比較:

      01if ( "$branch" == "master" ) then

      02echo "Branch detected: master"

      03git \

      04--work-tree=/path/to/where/you/want/to/copy/stuff/to \

      05checkout -f $branch || echo "master fail"

      06else if ( "$branch" == "dev" ) then

      07echo "Branch detected: dev"

      08Git \

      09--work-tree=/path/to/where/you/want/to/copy/stuff/to \

      10checkout -f $branch || echo "dev fail"

      11else

      12echo "Your push was successful."

      13echo "Private branch detected. No action triggered."

      14endif

      授予腳本執(zhí)行權(quán)限:

      1$ chmod +x ~/jupiter/.git/hooks/post-receive

      當用戶提交代碼到主服務器上的分支時,這些代碼會被復制到生產(chǎn)環(huán)境的目錄中,當代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復制到其它地方,而提交到其它任何分支上時不會觸發(fā)復制的操作。

      檢測某人是否正在嘗試將代碼提交到本不應該提交的分支上,或解析提交準許日志,等等的這些操作都像預提交腳本一樣簡單。

      Git的鉤子(Hooks)能夠處理復雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強大的系統(tǒng),允許你設計所有Git基礎設施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴格的Git用戶或是全職的Git管理員,那你得要深研了!

      在接下來的也就是此系列最后一篇文章,我們將學習怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。

      
    看了“liunx ssh命令詳解”還想看:

    1.Linux系統(tǒng)中SSH命令的使用教程

    2.linux命令ssh遠程登錄命令簡單實例

    3.linux命令 ssh使用解析

    4.Linux命令SSH在本地執(zhí)行遠程機器上的命令

    5.ssh遠程執(zhí)行命令方法和Shell腳本實例

    -- URL to which the push is being done

      3# If pushing without using a named remote those arguments will be equal.

      4#

      5# Information about commit is supplied as lines

      6# to the standard input in this form:

      7#

      并非所有的范例寫的都那么清晰,文檔對于什么鉤子需要什么變量的說明還有些不足(除非你要閱讀Git的源代碼),不過若有疑問,你可以通過trials of other users進行更多地了解,或者編寫一個簡單的腳本,輸出 class="main">

    liunx ssh命令詳解

    時間: 志藝942 分享
      我們將開始學習如何構(gòu)建一個Git服務器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網(wǎng)站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:

      liunx ssh命令詳解

      目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構(gòu)的設計。你可能會覺得這聽起來像“先進的Git技術(shù)”或者“如果你是學霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓,在一些情況下只需要了解一點Linux。分享Git服務

      創(chuàng)建自己的Git服務共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務。它不僅保證你隨時可以訪問你的代碼,它的無限制數(shù)據(jù)存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。

      假如你知道如何使用Git和SSH,那么你已經(jīng)知道如何創(chuàng)建一個Git服務器了。設計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經(jīng)創(chuàng)建了一半服務器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎。

      但是,會有一個小特設。有些計劃你可以構(gòu)建關(guān)于同樣數(shù)量的精心設計的Git服務器,但是可以具有更好擴展性。

      首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻者了,那么你應該為開發(fā)者搭建一個貢獻共享系統(tǒng)平臺。

      假定你有一個可用的服務器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權(quán)登錄,它比密碼登錄更加強大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。

      在你啟用了SSH密鑰認證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認證的用戶的共享用戶賬號:

      1$ su -c 'adduser gituser'

      然后切換到這個用戶,并使用合適的權(quán)限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權(quán)限設置太過于隨意,你自己針對SSH的防護默認就會失效。

      1$ su - gituser

      2$ mkdir .ssh && chmod 700 .ssh

      3$ touch .ssh/authorized_keys

      4$ chmod 600 .ssh/authorized_keys

      authorized_keys 文件里面有所有你賦予其權(quán)限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:

      1$ cat ~/path/to/id_rsa.bob.pub >> \

      2/home/gituser/.ssh/authorized_keys

      當開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務器。

      不過,你并不會真的想讓你的開發(fā)者訪問到服務器,即使只是以gituser用戶來進行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認shell:

      1# grep git-shell /etc/shells || su -c \

      2"echo `which git-shell` >> /etc/shells"

      3# su -c 'usermod -s git-shell gituser'

      現(xiàn)在gituser只能使用SSH來向Git資源庫進行推送和拉取操作,而不能訪問到一個登陸shell。你應該將你自己加入gituser對應的用戶組,在我們的示例服務器中它還是gituser。

      例如:

      1# usermod -a -G gituser seth

      剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務器上跟它進行直接交互(也就是說你不會通過SSH連上服務器然后直接在資源庫中進行操作), 這使其成為了一個基礎的資源庫。如果你想要把服務器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。

      嚴格來說,你并不用使其成為一個基礎資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠程用戶不會被允許向一個活動分支進行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎資源庫不能有活動分支,那就不會有問題發(fā)生了。

      你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權(quán)限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權(quán)限相當?shù)貒栏? 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.

      以root用戶創(chuàng)建一個基礎資源庫:

      1# git init --bare /opt/jupiter.git

      2# chown -R gituser:gituser /opt/jupiter.git

      3# chmod -R 770 /opt/jupiter.git

      現(xiàn)在任何已gituser認證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機上試試看:

      1$ git clone gituser@example.com:/opt/jupiter.git jupiter.clone

      2Cloning into 'jupiter.clone'...

      3Warning: you appear to have cloned an empty repository.

      記住:開發(fā)有必須讓他們的公共SSH密鑰導入gituser用戶的 authorized_keys 文件, 或者是擁有服務器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。

      Git鉤子

      運行你自己的Git服務器帶來的一個好處是它提供了Git鉤子。Git托管服務有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。

      這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標準的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。

      可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認情況下,Git附帶了一些范例,但沒有啟用。

      想要運行一個腳本嗎?使用起來很簡單。如果你還沒有Git倉庫的話,首先創(chuàng)建一個。

      1$ mkdir jupiter

      2$ cd jupiter

      3$ git init .

      然后編寫一個"hello world" Git鉤子。由于在工作中我為了傳統(tǒng)支持而使用tcsh,所以我堅持使用它作為我的腳本語言,但你可以自由地選用你喜愛的語言(Bash、Python、Ruby、Perl、Rust、Swift、Go):

      1$ echo "#\!/bin/tcsh" > .git/hooks/post-commit

      2$ echo "echo 'POST-COMMIT SCRIPT TRIGGERED'" > \

      3~/jupiter/.git/hooks/post-commit

      4$ chmod +x ~/jupiter/.git/hooks/post-commit

      現(xiàn)在進行測試:

      1$ echo "hello world" > foo.txt

      2$ git add foo.txt

      3$ git commit -m 'first commit'

      4! POST-COMMIT SCRIPT TRIGGERED

      5[master (root-commit) c8678e0] first commit

      61 file changed, 1 insertion(+)

      7create mode 100644 foo.txt

      這就是你的第一個可以正常運行的Git鉤子。

      著名的推送到web 鉤子

      一個流行的Git鉤子用法是自動推送改變部分到工作生產(chǎn)中的web服務器目錄。這是一個偉大構(gòu)建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內(nèi)容。

      如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應該做的是考慮如何網(wǎng)絡發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。

      Git變量

      每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關(guān)變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細節(jié),也不需要腳本,因為你可以套用現(xiàn)有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。

      Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數(shù)。不同的是,我們不會提供自己入?yún)?,所以使用它時要弄清楚你想要的是什么(參數(shù))。

      編寫一個Git鉤子之前,可以進入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:

      1# $1 -- Name of the remote to which the push is being done

      2# $2 -- URL to which the push is being done

      3# If pushing without using a named remote those arguments will be equal.

      4#

      5# Information about commit is supplied as lines

      6# to the standard input in this form:

      7#

      并非所有的范例寫的都那么清晰,文檔對于什么鉤子需要什么變量的說明還有些不足(除非你要閱讀Git的源代碼),不過若有疑問,你可以通過trials of other users進行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。

      分支檢測范例

      我發(fā)現(xiàn)在實際的生產(chǎn)中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務。

      首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務器上的遠程倉庫最有意義,而不是作為你的本地倉庫的一部分。

      我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:

      1#!/bin/tcsh

      2foreach arg ( $< )

      3set argv = ( $arg )

      4set refname = $1

      5end

      for循環(huán)讀第一個參數(shù)($1),然后再次循環(huán)讀入第二個參數(shù)值($2),接著用第三個參數(shù)($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數(shù)組。但是,這里使用的是tcsh,并且變量順序是預先定義好的,這樣做要安全些。

      當有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:

      1set branch = `git rev-parse --symbolic --abbrev-ref $refname`

      2echo $branch #DEBUG

      這時我們可以將分支名與基于動作名的關(guān)鍵字進行比較:

      01if ( "$branch" == "master" ) then

      02echo "Branch detected: master"

      03git \

      04--work-tree=/path/to/where/you/want/to/copy/stuff/to \

      05checkout -f $branch || echo "master fail"

      06else if ( "$branch" == "dev" ) then

      07echo "Branch detected: dev"

      08Git \

      09--work-tree=/path/to/where/you/want/to/copy/stuff/to \

      10checkout -f $branch || echo "dev fail"

      11else

      12echo "Your push was successful."

      13echo "Private branch detected. No action triggered."

      14endif

      授予腳本執(zhí)行權(quán)限:

      1$ chmod +x ~/jupiter/.git/hooks/post-receive

      當用戶提交代碼到主服務器上的分支時,這些代碼會被復制到生產(chǎn)環(huán)境的目錄中,當代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復制到其它地方,而提交到其它任何分支上時不會觸發(fā)復制的操作。

      檢測某人是否正在嘗試將代碼提交到本不應該提交的分支上,或解析提交準許日志,等等的這些操作都像預提交腳本一樣簡單。

      Git的鉤子(Hooks)能夠處理復雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強大的系統(tǒng),允許你設計所有Git基礎設施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴格的Git用戶或是全職的Git管理員,那你得要深研了!

      在接下來的也就是此系列最后一篇文章,我們將學習怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。

      
    看了“liunx ssh命令詳解”還想看:

    1.Linux系統(tǒng)中SSH命令的使用教程

    2.linux命令ssh遠程登錄命令簡單實例

    3.linux命令 ssh使用解析

    4.Linux命令SSH在本地執(zhí)行遠程機器上的命令

    5.ssh遠程執(zhí)行命令方法和Shell腳本實例

    、等。

      分支檢測范例

      我發(fā)現(xiàn)在實際的生產(chǎn)中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務。

      首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務器上的遠程倉庫最有意義,而不是作為你的本地倉庫的一部分。

      我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:

      1#!/bin/tcsh

      2foreach arg ( $< )

      3set argv = ( $arg )

      4set refname = class="main">

    liunx ssh命令詳解

    時間: 志藝942 分享

      5end

      for循環(huán)讀第一個參數(shù)( class="main">

    liunx ssh命令詳解

    時間: 志藝942 分享
      我們將開始學習如何構(gòu)建一個Git服務器,如何在具體的事件中寫一個針對特定的觸發(fā)操作的自定義Git(例如通告),如何發(fā)布你的代碼到一個網(wǎng)站。接下來是小編為大家收集的liunx ssh命令詳解,歡迎大家閱讀:

      liunx ssh命令詳解

      目前為止,用戶對Git的焦點主要在Git的使用上。這篇文章中,我將論述如何管理Git以及自定Git架構(gòu)的設計。你可能會覺得這聽起來像“先進的Git技術(shù)”或者“如果你是學霸讀這篇文章”的委婉說法,但是事實上理解Git如何工作不需要任何的高深知識或者專業(yè)培訓,在一些情況下只需要了解一點Linux。分享Git服務

      創(chuàng)建自己的Git服務共享非常簡單, 在許多情況下值得去創(chuàng)建這樣一個Git服務。它不僅保證你隨時可以訪問你的代碼,它的無限制數(shù)據(jù)存儲、持續(xù)集成跟部署同時為個人Git管理打開了一道Git延伸與拓展的大門。

      假如你知道如何使用Git和SSH,那么你已經(jīng)知道如何創(chuàng)建一個Git服務器了。設計Git的方式,你創(chuàng)建或者克隆一個倉庫時,你已經(jīng)創(chuàng)建了一半服務器。使能SSH訪問倉庫,并且任何訪問你倉庫的人都可以使用你的回購協(xié)議作為一個新克隆的基礎。

      但是,會有一個小特設。有些計劃你可以構(gòu)建關(guān)于同樣數(shù)量的精心設計的Git服務器,但是可以具有更好擴展性。

      首先是:識別你的用戶,包括閑雜與未來的。假如你是唯一用戶,那么無需任何改變,但是如果你邀請國外的貢獻者了,那么你應該為開發(fā)者搭建一個貢獻共享系統(tǒng)平臺。

      假定你有一個可用的服務器(如果不是,Git無法解決這個問題,但是運行在Raspberry Pi 3 的CentOS將會是一個良好開端),第一步是采用SSH鍵值授權(quán)登錄,它比密碼登錄更加強大,因為它能免疫于蠻力攻擊,并且可以避免用戶盡可能簡單地刪除它們的鍵值。

      在你啟用了SSH密鑰認證之后,就創(chuàng)建一個 gituser用戶。這是一個提供給所有通過了認證的用戶的共享用戶賬號:

      1$ su -c 'adduser gituser'

      然后切換到這個用戶,并使用合適的權(quán)限創(chuàng)建一個 ~/.ssh 框架。這非常重要,因為如果權(quán)限設置太過于隨意,你自己針對SSH的防護默認就會失效。

      1$ su - gituser

      2$ mkdir .ssh && chmod 700 .ssh

      3$ touch .ssh/authorized_keys

      4$ chmod 600 .ssh/authorized_keys

      authorized_keys 文件里面有所有你賦予其權(quán)限操作你的Git工程的開發(fā)者的SSH公共密鑰。你的開發(fā)者必須創(chuàng)建屬于他們自己的SSH密鑰并將其中的公共密鑰發(fā)送給你。要把這些公共密鑰復制到gituser的 authorized_keys 文件中去。例如,對于一個叫做Bob的開發(fā)者,可以運行這些命令:

      1$ cat ~/path/to/id_rsa.bob.pub >> \

      2/home/gituser/.ssh/authorized_keys

      當開發(fā)者Bob持有能匹配他發(fā)送給你的公共密鑰的私有密鑰時,他就能以gituser訪問服務器。

      不過,你并不會真的想讓你的開發(fā)者訪問到服務器,即使只是以gituser用戶來進行訪問。你想要的是讓他們只能訪問到Git資源庫。因為這個原因,Git提供了一個受限的shell,恰如其分的將其稱為 git-shell、以root用戶運行下面的這些命令可以將git-shell添加到你的系統(tǒng)中,并使其成為gituser用戶的默認shell:

      1# grep git-shell /etc/shells || su -c \

      2"echo `which git-shell` >> /etc/shells"

      3# su -c 'usermod -s git-shell gituser'

      現(xiàn)在gituser只能使用SSH來向Git資源庫進行推送和拉取操作,而不能訪問到一個登陸shell。你應該將你自己加入gituser對應的用戶組,在我們的示例服務器中它還是gituser。

      例如:

      1# usermod -a -G gituser seth

      剩下的唯一一個步驟就是創(chuàng)建一個Git資源庫。因為不會有人在服務器上跟它進行直接交互(也就是說你不會通過SSH連上服務器然后直接在資源庫中進行操作), 這使其成為了一個基礎的資源庫。如果你想要把服務器上的資源庫用起來,就要將其從它所在的地方克隆到自己的home目錄中去。

      嚴格來說,你并不用使其成為一個基礎資源庫,它還是可以作為一個普通的資源庫來操作的。不過,一個基礎資源庫是沒有*工作樹(working tree)* (也就是說,不會有分支會處在”checkout“狀態(tài))。這很重要,因為遠程用戶不會被允許向一個活動分支進行推送 (你是不會想在一個”dev“分支工作時突然有人將變更推送到你的工作空間的?)。因為基礎資源庫不能有活動分支,那就不會有問題發(fā)生了。

      你可以將資源庫放到任何你想要放置的地方, 只要你想賦予權(quán)限的用戶和組也能訪問到它就行了。你不會想將目錄存儲到一個用戶的home目錄的,因為這里的權(quán)限相當?shù)貒栏? 而是要放在一個通用共享的位置,例如 /opt or /usr/local/share.

      以root用戶創(chuàng)建一個基礎資源庫:

      1# git init --bare /opt/jupiter.git

      2# chown -R gituser:gituser /opt/jupiter.git

      3# chmod -R 770 /opt/jupiter.git

      現(xiàn)在任何已gituser認證的、或者是位于gituser分組的用戶都可以讀取和寫入jupiter.git資源庫。你可以在自己本機上試試看:

      1$ git clone gituser@example.com:/opt/jupiter.git jupiter.clone

      2Cloning into 'jupiter.clone'...

      3Warning: you appear to have cloned an empty repository.

      記?。洪_發(fā)有必須讓他們的公共SSH密鑰導入gituser用戶的 authorized_keys 文件, 或者是擁有服務器上面的賬戶(就像你一樣), 那樣的話他們就必須是gituser組的成員。

      Git鉤子

      運行你自己的Git服務器帶來的一個好處是它提供了Git鉤子。Git托管服務有時也提供了一個類似鉤子的接口,但那并不是真正的可以訪問文件系統(tǒng)的Git鉤子。一個Git鉤子是一個腳本,它在Git進程中的某個時刻執(zhí)行。在一個倉庫(repository)接受一個提交(commit)之前,或者收到一個提交之后,或者接收一個推送(push)之前,或者收到一個推送之后等時刻執(zhí)行一個鉤子。

      這個系統(tǒng)很簡單:任何可執(zhí)行的腳本都存放在.git/hooks目錄中,使用標準的命名方案,并且在某個指定的時刻執(zhí)行。腳本執(zhí)行的時間由名字來決定;pre-push腳本在推送之前執(zhí)行,post-receive腳本在收到一個提交之后執(zhí)行,諸如此類。它基本上屬于自文檔(self-documenting)。

      可以使用任何語言編寫鉤子腳本;如果你能在你的系統(tǒng)上運行某種語言的hello world腳本,那么你就可以使用那門語言來編寫Git鉤子腳本。默認情況下,Git附帶了一些范例,但沒有啟用。

      想要運行一個腳本嗎?使用起來很簡單。如果你還沒有Git倉庫的話,首先創(chuàng)建一個。

      1$ mkdir jupiter

      2$ cd jupiter

      3$ git init .

      然后編寫一個"hello world" Git鉤子。由于在工作中我為了傳統(tǒng)支持而使用tcsh,所以我堅持使用它作為我的腳本語言,但你可以自由地選用你喜愛的語言(Bash、Python、Ruby、Perl、Rust、Swift、Go):

      1$ echo "#\!/bin/tcsh" > .git/hooks/post-commit

      2$ echo "echo 'POST-COMMIT SCRIPT TRIGGERED'" > \

      3~/jupiter/.git/hooks/post-commit

      4$ chmod +x ~/jupiter/.git/hooks/post-commit

      現(xiàn)在進行測試:

      1$ echo "hello world" > foo.txt

      2$ git add foo.txt

      3$ git commit -m 'first commit'

      4! POST-COMMIT SCRIPT TRIGGERED

      5[master (root-commit) c8678e0] first commit

      61 file changed, 1 insertion(+)

      7create mode 100644 foo.txt

      這就是你的第一個可以正常運行的Git鉤子。

      著名的推送到web 鉤子

      一個流行的Git鉤子用法是自動推送改變部分到工作生產(chǎn)中的web服務器目錄。這是一個偉大構(gòu)建FTP的方式,保留開發(fā)環(huán)節(jié)的全版本控制,并且整合、自動化發(fā)布內(nèi)容。

      如果正確執(zhí)行,它將會工作運行良好,在某一種程度來說,一直應該做的是考慮如何網(wǎng)絡發(fā)布。它是不錯的。我不知道最初是誰想出這主意的,但是我第一次是從EMacs和來自IBM公司的Git-mentor、Bill Von Hagen那里聽到的。他的文章仍然是對這個過程起決定性作用的介紹:Git 改變分布式Web開發(fā)規(guī)則。

      Git變量

      每個Git鉤子獲取一組不同的Git動作觸發(fā)它的相關(guān)變量。你可能會用到這些變量,也可能用不到。這取決于你所寫的作品。 如果你想要的是一個普通的郵件來通知你,有人推了東西。那么你不需要細節(jié),也不需要腳本,因為你可以套用現(xiàn)有的樣板。如果你想在郵件里瀏覽別人提交的信息和作者,那么對你的腳本要求更高。

      Git鉤子并不是用戶直接運行的,所以要理解透如何獲取這些混亂卻重要的信息。事實上,一個Git鉤子腳本與其他任何腳本類似,像BASH、Python、C++或者其他腳本一樣的方式接受來自stdin的參數(shù)。不同的是,我們不會提供自己入?yún)?,所以使用它時要弄清楚你想要的是什么(參數(shù))。

      編寫一個Git鉤子之前,可以進入到你的項目目錄.git/hooks查看Git提供的范例。例如,下面是pre-push.sample文件的注釋部分:

      1# $1 -- Name of the remote to which the push is being done

      2# $2 -- URL to which the push is being done

      3# If pushing without using a named remote those arguments will be equal.

      4#

      5# Information about commit is supplied as lines

      6# to the standard input in this form:

      7#

      并非所有的范例寫的都那么清晰,文檔對于什么鉤子需要什么變量的說明還有些不足(除非你要閱讀Git的源代碼),不過若有疑問,你可以通過trials of other users進行更多地了解,或者編寫一個簡單的腳本,輸出$1、$2、$3等。

      分支檢測范例

      我發(fā)現(xiàn)在實際的生產(chǎn)中對鉤子最常見的需求是針對受影響的分支觸發(fā)特定的事件。下面這個例子演示了如何解決這樣的任務。

      首先,Git鉤子本身不是版本控制。也就是說,Git不會跟蹤它自己的鉤子,因為Git鉤子是Git的組成部分而不是你的倉庫的一部分。因此,Git鉤子在監(jiān)視提交和推送的同時,可能對你的Git服務器上的遠程倉庫最有意義,而不是作為你的本地倉庫的一部分。

      我們來編寫一個基于post-receive運行的鉤子(即,收到一個提交之后)。第一步是識別分支名字:

      1#!/bin/tcsh

      2foreach arg ( $< )

      3set argv = ( $arg )

      4set refname = $1

      5end

      for循環(huán)讀第一個參數(shù)($1),然后再次循環(huán)讀入第二個參數(shù)值($2),接著用第三個參數(shù)($3)再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數(shù)組。但是,這里使用的是tcsh,并且變量順序是預先定義好的,這樣做要安全些。

      當有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:

      1set branch = `git rev-parse --symbolic --abbrev-ref $refname`

      2echo $branch #DEBUG

      這時我們可以將分支名與基于動作名的關(guān)鍵字進行比較:

      01if ( "$branch" == "master" ) then

      02echo "Branch detected: master"

      03git \

      04--work-tree=/path/to/where/you/want/to/copy/stuff/to \

      05checkout -f $branch || echo "master fail"

      06else if ( "$branch" == "dev" ) then

      07echo "Branch detected: dev"

      08Git \

      09--work-tree=/path/to/where/you/want/to/copy/stuff/to \

      10checkout -f $branch || echo "dev fail"

      11else

      12echo "Your push was successful."

      13echo "Private branch detected. No action triggered."

      14endif

      授予腳本執(zhí)行權(quán)限:

      1$ chmod +x ~/jupiter/.git/hooks/post-receive

      當用戶提交代碼到主服務器上的分支時,這些代碼會被復制到生產(chǎn)環(huán)境的目錄中,當代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復制到其它地方,而提交到其它任何分支上時不會觸發(fā)復制的操作。

      檢測某人是否正在嘗試將代碼提交到本不應該提交的分支上,或解析提交準許日志,等等的這些操作都像預提交腳本一樣簡單。

      Git的鉤子(Hooks)能夠處理復雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強大的系統(tǒng),允許你設計所有Git基礎設施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴格的Git用戶或是全職的Git管理員,那你得要深研了!

      在接下來的也就是此系列最后一篇文章,我們將學習怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。

      
    看了“liunx ssh命令詳解”還想看:

    1.Linux系統(tǒng)中SSH命令的使用教程

    2.linux命令ssh遠程登錄命令簡單實例

    3.linux命令 ssh使用解析

    4.Linux命令SSH在本地執(zhí)行遠程機器上的命令

    5.ssh遠程執(zhí)行命令方法和Shell腳本實例

    ),接著用第三個參數(shù)()再次循環(huán)。在Bash中有更好的方式:使用read命令,將這些值放入一個數(shù)組。但是,這里使用的是tcsh,并且變量順序是預先定義好的,這樣做要安全些。

      當有即將提交的refname時,我們可以使用Git來獲取可讀性的分支名:

      1set branch = `git rev-parse --symbolic --abbrev-ref $refname`

      2echo $branch #DEBUG

      這時我們可以將分支名與基于動作名的關(guān)鍵字進行比較:

      01if ( "$branch" == "master" ) then

      02echo "Branch detected: master"

      03git \

      04--work-tree=/path/to/where/you/want/to/copy/stuff/to \

      05checkout -f $branch || echo "master fail"

      06else if ( "$branch" == "dev" ) then

      07echo "Branch detected: dev"

      08Git \

      09--work-tree=/path/to/where/you/want/to/copy/stuff/to \

      10checkout -f $branch || echo "dev fail"

      11else

      12echo "Your push was successful."

      13echo "Private branch detected. No action triggered."

      14endif

      授予腳本執(zhí)行權(quán)限:

      1$ chmod +x ~/jupiter/.git/hooks/post-receive

      當用戶提交代碼到主服務器上的分支時,這些代碼會被復制到生產(chǎn)環(huán)境的目錄中,當代碼提交到開發(fā)環(huán)境上的分支時,這些代碼會被復制到其它地方,而提交到其它任何分支上時不會觸發(fā)復制的操作。

      檢測某人是否正在嘗試將代碼提交到本不應該提交的分支上,或解析提交準許日志,等等的這些操作都像預提交腳本一樣簡單。

      Git的鉤子(Hooks)能夠處理復雜的事情,同時它通過利用Git工作的抽象層讓人費解,但它是一個強大的系統(tǒng),允許你設計所有Git基礎設施中的動作。如果你只是想要熟悉這個過程,那你可以簡單研究一下,如果你是一個嚴格的Git用戶或是全職的Git管理員,那你得要深研了!

      在接下來的也就是此系列最后一篇文章,我們將學習怎么通過Git來管理非文本的大文件,如音頻文件、圖像文件。

      
    看了“liunx ssh命令詳解”還想看:

    1.Linux系統(tǒng)中SSH命令的使用教程

    2.linux命令ssh遠程登錄命令簡單實例

    3.linux命令 ssh使用解析

    4.Linux命令SSH在本地執(zhí)行遠程機器上的命令

    5.ssh遠程執(zhí)行命令方法和Shell腳本實例

    2961526 主站蜘蛛池模板: 特级毛片免费播放| 欧美精品黑人粗大| 国产在线精品一区二区不卡麻豆| 人人澡人人澡人人看添欧美| 免费在线视频你懂的| 女人让男人免费桶爽30分钟 | yy6080理aa级伦大片一级毛片| 杨幂精品国产专区91在线| 出差被绝伦上司侵犯中文字幕 | 久久精品国产精品亚洲毛片| 男女一边摸一边脱视频网站 | 久久精品国产99国产| 男女xx动态图| 国产亚洲一区二区三区在线观看| √天堂资源中文官网bt| 日韩三级在线电影| 亚洲爆乳无码专区www| 草莓在线观看视频| 天天干天天做天天操| 久久99热只有频精品8| 欧美三级黄视频| 亚洲香蕉久久一区二区三区四区| 很黄很污的视频在线观看| 夜夜高潮天天爽欧美| 中文字幕三级电影| 暖暖在线日本免费中文| 亚洲熟妇AV乱码在线观看| 精品久久久久久久久久中文字幕 | 亚洲w码欧洲s码免费| 特级欧美老少乱配| 啊灬啊灬啊灬快灬深用力| 国产亚洲成归v人片在线观看| 成年美女黄网站色| 九九热在线视频观看这里只有精品| 美女被暴羞羞免费视频| 国产成人精品999在线观看| 67194成是人免费无码| 奇米影视7777狠狠狠狠色| 久久久久久不卡| 最新版天堂中文在线| 亚洲宅男精品一区在线观看|