1. 簡介
sshcp 命令使您可以通過一個簡短的命令就實現(xiàn)如下功能:
- 把本地指定目錄或文件 上傳到 服務(wù)器的指定的目標目錄中,上傳之前也可配置是否要清空服務(wù)器的目標目錄;
- 自動登錄服務(wù)器,并轉(zhuǎn)到指定的目標目錄中;
主頁:https://github.com/GuoBinyong/sshcp
如果您在使用的過程中遇到了問題,或者有好的建議和想法,您都可以通過以下方式聯(lián)系我,期待與您的交流:
- 給該倉庫提交 issues
- 給我 Pull requests
2. sshcp解決的問題
工作中經(jīng)常需要將一些文件上傳到服務(wù)器,而通常的步驟如下:
- 通過 ssh 命令登錄到服務(wù)器,如:
ssh -l root -p 22 192.168.90.33
- 輸入登錄服務(wù)器的密碼;
- 通過 cd 命令轉(zhuǎn)到指定目錄,如:
cd /data/mc/website/guo.binyong.com/www/webapp
- 通過 rm 命令刪除掉所有的文件,如:
rm -rf *
- 退出 ssh 登錄;
- 通過 scp 命令將 本地某個目錄里的所有文件 上傳 到服務(wù)器剛才刪除的目錄內(nèi),如:
scp -r dist/* root@192.168.90.33:/data/mc/website/guo.binyong.com/www/webapp
- 輸入登錄服務(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 sshcp
或chmod 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)先級從底到高排列):
- 用戶級的公共配置文件: ~/.sshcp/sshcprc[.tcl]
- 用戶級的私有配置文件:~/.sshcp/sshcprc.<type>[.tcl]
- 項目級的公共配置文件: <PWD>/<conf>[.tcl]
- 項目級的私有配置文件: <PWD>/<conf>.<type>[.tcl]
- 命令行選項
備注:
- 尖括號
<>
表示取相應(yīng)變量的值 - 方括號
[]
表示是可選的
8.4. 配置文件查找規(guī)則
腳本會按照下面的順序查找配置文件,如果找到,就會加載該配置文件并停止查找:
- 查找?guī)鄳?yīng)的帶
tcl
后綴名的配置文件; - 查找不相應(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 {#}