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

1. 簡介

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

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

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

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

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

2. sshcp解決的問題

工作中經常需要將一些文件上傳到服務器,而通常的步驟如下:

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

每次上傳,都要經過這幾步,對于經常上傳的人來說,這簡直是災難;

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

那怎么辦呢?

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

3. 特性

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

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安裝

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

8. 配置文件

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

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

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

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

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

8.2. 配置文件可分為兩類

  • 私有配置文件:帶有由 type 選項和變量指定的字符串作為中綴名的配置文件;該配置文件,只有設置了 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. 命令行選項

備注:

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

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

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

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

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

9. 可配置變量

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

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

type

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

set type "dev"

conf

配置文件的路徑

set conf "sshcprc"

name

ssh登錄時的用戶名

set name "keyanzhe"

password

用戶名對應的密碼

set password "123456789"

host

服務器的地址

set host "192.168.90.33"

prot

服務器的端口

set prot "9033"

sour

源目錄;

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

targ

服器上的目標目錄

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

dele

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

set dele 0

prompt

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

  • 該參數只有在交互模式下才有效;
  • 該參數有助于精準識別 ssh 登錄成功;
  • 由于該參數保存的是正則表達式,所以為了避免 tcl 正則的特殊字符 當作 tcl 的特殊字符去展開,建義在使用配置文件配置該參數時,將配置的正則表達式用 花括號 {} 包裹著;
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 {#}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容