上傳神器sshcp:ssh免密登錄、scp一鍵上傳

1. 簡介

sshcp 命令使您可以通過一個簡短的命令就實現(xiàn)如下功能:

  • 把本地指定目錄或文件 上傳到 服務(wù)器的指定的目標目錄中,上傳之前也可配置是否要清空服務(wù)器的目標目錄;
  • 自動登錄服務(wù)器,并轉(zhuǎn)到指定的目標目錄中;

主頁:https://github.com/GuoBinyong/sshcp

如果您在使用的過程中遇到了問題,或者有好的建議和想法,您都可以通過以下方式聯(lián)系我,期待與您的交流:

  • 給該倉庫提交 issues
  • 給我 Pull requests

2. sshcp解決的問題

工作中經(jīng)常需要將一些文件上傳到服務(wù)器,而通常的步驟如下:

  1. 通過 ssh 命令登錄到服務(wù)器,如:ssh -l root -p 22 192.168.90.33
  2. 輸入登錄服務(wù)器的密碼;
  3. 通過 cd 命令轉(zhuǎn)到指定目錄,如:cd /data/mc/website/guo.binyong.com/www/webapp
  4. 通過 rm 命令刪除掉所有的文件,如:rm -rf *
  5. 退出 ssh 登錄;
  6. 通過 scp 命令將 本地某個目錄里的所有文件 上傳 到服務(wù)器剛才刪除的目錄內(nèi),如:scp -r dist/* root@192.168.90.33:/data/mc/website/guo.binyong.com/www/webapp
  7. 輸入登錄服務(wù)器的密碼;

每次上傳,都要經(jīng)過這幾步,對于經(jīng)常上傳的人來說,這簡直是災(zāi)難;

能不能直接寫個 shell 腳本,自動執(zhí)行呢?不能,因為 ssh 命令 和 scp 命令都沒有提供密碼選項,只能以交互的方式運行,即:只能手動輸入密碼;

那怎么辦呢?

為了解決這個問題,我專門研究了 expect 和 tcl 腳本語言,最終,sshcp 工具誕生了;

3. 特性

  • 一鍵上傳指定的文件或文件夾到服務(wù)器的指定目錄內(nèi);
  • 一鍵登錄并轉(zhuǎn)到服務(wù)器的相應(yīng)目錄;
  • 所有配置均可通過 命令行參數(shù)的形式 或 配置文件的形式提供;
  • 支持多級配置文件,局部配置文件的配置會覆蓋全局配置文件的配置;
  • 支持多種運行模式,通過 type 選項,自動會加載對應(yīng)類型的配置文件,方便隨時切換不同的配置;

4. 依賴

sshcp 依賴于 expect;所以運行些腳本之前,需要保證環(huán)境中能訪問到 expect 命令;

注意:Mac系統(tǒng)自帶 expect,無需額外安裝其它東西

5. 安裝方式

方式1:直接安裝

直接將 sshcp倉庫 中的 sshcp 文件放入命令行的 PATH 目錄中,如:/usr/local/bin/

注意:

  • 如果在你電腦中提示 sshcp 不是可執(zhí)行文件,則可以對 sshcp 文件執(zhí)行以下命令 chmod a+x sshcpchmod u+x sshcp

方式2:通過brew安裝

如果你的電腦上已經(jīng)安裝了包管理工具 brew,則可以通過 brew 來安裝,命令如下:

brew install sshcp

方式3:通過自帶的下載命令安裝

curl https://raw.githubusercontent.com/GuoBinyong/sshcp/master/sshcp -o /usr/local/bin/sshcp && chmod a+x /usr/local/bin/sshcp

6. 語法

sshcp [-tp|--type type] [-c|--conf conf] [-pw|--password password] [-h|--host host] [-p|--prot prot] [-s|--sour sour] [-t|--targ targ] [-d|--dele dele] [-pmt|--prompt prompt]

sshcp [-help|--help|help]

7. 選項

sshcp 命令支持以下選項

  • -help|--help|help : 輸出 sshcp 命令的幫助信息
  • -tp|--type : 配置文件的類型,指定該參數(shù),會優(yōu)先匹配帶有以該類型作為中綴名的配置文件;
  • -c|--conf : 配置文件的路徑
  • -n|--name : ssh登錄時的用戶名
  • -pw|--password : 用戶名對應(yīng)的密碼
  • -h|--host : 服務(wù)器的地址
  • -p|--prot : 服務(wù)器的端口
  • -s|--sour : 源目錄;
    • 如果沒有給該參數(shù)配置有效的值,則會進入交互模式,即:登錄服務(wù)器并跳轉(zhuǎn)到目標目錄后,自動將控制權(quán)交給用戶;
    • 如果該參數(shù)的值是以 / 結(jié)尾的目錄路徑,則會將該目錄下的所有文件 和 文件夾 都上傳到服務(wù)器的目標目錄下;
    • 如果該參數(shù)的值不是以 / 結(jié)尾的 目錄或文件,則會將 該目錄 或 文件 上傳到服務(wù)器的目標目錄下;
  • -t|--targ : 服器上的目標目錄
  • -d|--dele : 在上傳sour目錄中的文件之前,是否刪除 targ 目錄中的所有文件; 0 : 不刪除;1 : 刪除; 默認值: 0 ;
  • -pmt|--prompt : 能匹配服務(wù)器的命令行提示符的字符串 或 正則表達式; 默認值:\S,即表示:包含非空字符的字符串;
    • 該參數(shù)只有在交互模式下才有效;
    • 該參數(shù)有助于精準識別 ssh 登錄成功;
    • 由于該參數(shù)保存的是正則表達式,所以為了避免 tcl 正則的特殊字符 當作 tcl 的特殊字符去展開,建義在使用配置文件配置該參數(shù)時,將配置的正則表達式用 花括號 {} 包裹著;

8. 配置文件

配置文件是作為 tcl 腳本被優(yōu)先執(zhí)行的,所以配置文件中可以書寫 tcl 代碼來實現(xiàn)更加細粒度的控制和配置;

配置文件的全名(完整名稱)由三部分組成:配置文件名、中綴名、后綴名,由 點 . 分隔,格式如下:

配置文件名.type.tcl
  • 配置文件名 是 由 -c|--conf 選項指定的文件名
  • 中綴名 是 由 -tp|--type 選項指定的類型字符串
  • 后綴名 是 tcl
  • 中綴名 和 后綴名 是 可選的;

8.1. 配置文件可存放在兩個地方

  • 用戶級配置文件:存放在~/.sshcp/ 目錄下,文件前綴名為 sshcprc;
  • 項目級配置文件:存放在當前目錄下,文件的前綴名為 conf 選項和變量設(shè)置的字符串,如果沒有配置conf選項和變量,則默認的前綴名為 sshcprc

8.2. 配置文件可分為兩類

  • 私有配置文件:帶有由 type 選項和變量指定的字符串作為中綴名的配置文件;該配置文件,只有設(shè)置了 type 選項或變量時,才會被加載
  • 公共配置文件:不帶有由 type 選項和變量指定的字符串作為中綴名的配置文件;該配置文件只要存在,就會被加載;

8.3. 配置文件的加載順序和優(yōu)先級

選項和變量配置文件的加載順序和優(yōu)先級如下(優(yōu)先級從底到高排列):

  1. 用戶級的公共配置文件: ~/.sshcp/sshcprc[.tcl]
  2. 用戶級的私有配置文件:~/.sshcp/sshcprc.<type>[.tcl]
  3. 項目級的公共配置文件: <PWD>/<conf>[.tcl]
  4. 項目級的私有配置文件: <PWD>/<conf>.<type>[.tcl]
  5. 命令行選項

備注:

  • 尖括號 <> 表示取相應(yīng)變量的值
  • 方括號 [] 表示是可選的

8.4. 配置文件查找規(guī)則

腳本會按照下面的順序查找配置文件,如果找到,就會加載該配置文件并停止查找:

  1. 查找?guī)鄳?yīng)的帶 tcl 后綴名的配置文件;
  2. 查找不相應(yīng)的不帶 tcl 后綴名的配置文件;

腳本會先查找?guī)?tcl 后綴名的配置文件,如果找到了,則會加載帶 tcl 后綴名的配置文件,并且會忽略相應(yīng)的不帶 tcl 后綴名的配置文件;如果沒有找到,則會繼續(xù)查找不帶 tcl 后綴名的配置文件;

9. 可配置變量

配置文件中可設(shè)置的變量及其語法示例如下

注意:以下所有配置字段的值均是字符串,字符串可以用雙引號 " 或 花括號 {} 包裹著,也可以不用包裹,當字符串中包含空格等能引起不達預期效果的字符時,可以通過將該字符串包裹在 雙引號 或 花括號 {} 中來解決這類問題

type

配置文件的類型 該類型會作為配置文件的中綴名;

set type "dev"

conf

配置文件的路徑

set conf "sshcprc"

name

ssh登錄時的用戶名

set name "keyanzhe"

password

用戶名對應(yīng)的密碼

set password "123456789"

host

服務(wù)器的地址

set host "192.168.90.33"

prot

服務(wù)器的端口

set prot "9033"

sour

源目錄;

  • 如果沒有給該參數(shù)配置有效的值,則會進入交互模式,即:登錄服務(wù)器并跳轉(zhuǎn)到目標目錄后,自動將控制權(quán)交給用戶;
  • 如果該參數(shù)的值是以 / 結(jié)尾的目錄路徑,則會將該目錄下的所有文件 和 文件夾 都上傳到服務(wù)器的目標目錄下;
  • 如果該參數(shù)的值不是以 / 結(jié)尾的 目錄或文件,則會將 該目錄 或 文件 上傳到服務(wù)器的目標目錄下;
set sour "dist/"

targ

服器上的目標目錄

set targ "/data/mc/website/guo.binyong.com/www/webapp"

dele

在上傳sour目錄中的文件之前,是否刪除 targ 目錄中的所有文件; 0 : 不刪除;1 : 刪除; 默認值: 0 ;

set dele 0

prompt

能匹配服務(wù)器的命令行提示符的字符串 或 正則表達式; 默認值:\S,即表示:包含非空字符的字符串;

  • 該參數(shù)只有在交互模式下才有效;
  • 該參數(shù)有助于精準識別 ssh 登錄成功;
  • 由于該參數(shù)保存的是正則表達式,所以為了避免 tcl 正則的特殊字符 當作 tcl 的特殊字符去展開,建義在使用配置文件配置該參數(shù)時,將配置的正則表達式用 花括號 {} 包裹著;
set prompt {\S}

10. 配置文件示例

sshcprc.tcl

set name keyanzhe
set password 123456789
set host 192.168.90.33
set prot 9033
set sour dist/
set targ "/data/mc/website/guo.binyong.com/www/webapp"
set prompt {#}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370