前端基於SSH的自動部署

ssh簡介

SSH是一種網絡協議,用於計算機之間的加密登陸。原理:html

  • 遠程主機收到用戶的登陸請求,把本身的公鑰發給用戶。
  • 用戶使用這個公鑰,將登陸密碼加密後,發送回來。
  • 遠程主機用本身的私鑰,解密登陸密碼,若是密碼正確,就贊成用戶登陸。

當遠程主機的公鑰被接受之後,它就會被保存在本地文件~/.ssh/known_hosts之中,此外系統也有一個這樣的文件,一般是/etc/ssh/ssh_known_hosts,保存一些對全部用戶均可信賴的遠程主機的公鑰。前端

經常使用指令

  • 本地登陸服務器 ssh user@remote -p port,端口是22的話ssh user@remote,退出登陸exit
  • 本地免密碼登陸 ssh-copy-id user@remote -p port,這在寫腳本服務器控制時特別有用
  • 給服務器配置別名 code ~/.ssh/config追加一些內容,就能夠ssh selfname登陸,再也不須要記服務器ip地址了
  • 執行命令ssh selfname "cd ~;ls",將會在服務器上執行引號裏的命令,執行以後其自動關閉遠程服務
  • 將a電腦文件(夾)複製到b電腦上哪一個文件夾下面:scp username@a電腦ip:文件路徑 username@b電腦ip:文件夾路徑,是文件夾的話加上-r,這裏也能夠用別名,一般本機的話省略username@a電腦ip:
ssh user@remote -p port

# user 是你在遠程機器上的用戶名,若是不指定的話默認爲當前用戶
# remote 是遠程機器的地址,能夠是 IP,域名,或者是後面會提到的別名
# port 是 SSH Server 監聽的端口,若是不指定的話就爲默認值 22
# 好比我經常使用的 ssh zhm@120.79.52.223

複製代碼

一般在本地電腦輸入以上命令以後,遠程服務器就會詢問密碼,你輸入的時候是看不見任何波動,輸入完回車就能夠了~,若是報錯ssh: connect to host remote port 22: Connection refused,說明服務器沒有按照ssh server,Ubantu Desktop系統默認是沒有這個的,安裝命令sudo apt-get install openssh-servernode

免密登陸

每次 ssh 都要輸入密碼是否是很煩呢?與密碼驗證相對的,是公鑰驗證。也就是說,要實現免密碼登入,首先要設置 SSH 鑰匙。也就是本地電腦生成公鑰私鑰,而後把公鑰放在遠程服務器上就能夠了! 原理很簡單,就是用戶將本身的公鑰儲存在遠程主機上。登陸的時候,遠程主機會向用戶發送一段隨機字符串,用戶用本身的私鑰加密後,再發回來。遠程主機用事先儲存的公鑰進行解密,若是成功,就證實用戶是可信的,直接容許登陸shell,再也不要求密碼。linux

# 查看本地有沒有
ls ~/.ssh
# 沒有就生成
ssh-keygen
# 在~/.ssh/目錄下,會新生成兩個文件:id_rsa.pub和id_rsa。前者是你的公鑰,後者是你的私鑰。
# 把公鑰放到遠程服務器
ssh-copy-id user@remote -p port
# 好比個人 ssh-copy-id zhm@120.79.52.223

複製代碼

ssh-copy-id基本都安裝了,萬一沒有,mac上brew install ssh-copy-id。 windows麻煩點ssh user@remote -p port 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub,意思是在遠端執行新建 .ssh 文件夾,並把本地的 ~/.ssh/id_rsa.pub (也就是公鑰)追加到遠端的 .ssh/authorized_keys 中。固然,不使用這條命令的話,你也能夠手動操做這個過程,即先複製公鑰,再登入遠程機器,粘貼到 .ssh/authorized_keys 當中。git

配置別名

每次都輸入 ssh user@remote -p port,時間久了也會以爲很麻煩,特別是當 user, remote 和 port 都得輸入,並且還很差記憶的時候。配置別名可讓咱們進一步偷懶。好比我想用ssh lab替換上面一串算法

# cat>>某文件<<EOF追加下內容, >> 追加的意思 <<EOF 遇到EOF終止
# 由於是前端,直接用vscode編輯
code ~/.ssh/config
# 追加如下內容,保存
Host lab
    HostName remote
    User user
    Port port

# 來登陸吧
ssh lab

# 好比個人
# Host han
    # HostName 120.79.52.223
    # User zhm
    # Port 22
# ssh han
複製代碼

命令行執行登陸而且在目標服務器上執行命令

命令行執行登陸而且在目標服務器上執行命令:shell

# 單引號或者雙引號,將命令包起來,而後分號隔開命令
ssh user@remoteNode "cd /home ; ls"
複製代碼

若是是不少命令的話,須要建一個腳本。segmentfault

# 建一個腳本文件test.sh,裏面寫上這個,而後執行 sh test.sh
#!/bin/bash 
# 遠程執行的內容在"< < remotessh " 至" remotessh "之間,若是不想本機出現日誌的話 ssh user@remoteNode >/dev/null 2>&1 << remotessh
ssh user@remoteNode << remotessh
ls
exit
remotessh
複製代碼

傳輸文件

兩臺機器間文件傳輸能夠用scp,它的地址格式與 ssh 基本相同,都是能夠省略用戶名和端口,稍微的差異在與指定端口時用的是大寫的 -P 而不是小寫的。不過,若是你已經配置了別名,那麼這都不重要,由於 scp 也支持直接用別名windows

# 總的:本機的能夠省略電腦的ip,默認的遠程當前文件夾是 Home目錄(~),將A電腦上的文件複製到B電腦上
# 注意的地方:A如果文件,B電腦若也是文件的路徑,無論文件存不存在,都會將A文件內容寫入到B這個文件。
# B電腦如果文件夾,無論文件夾存不存在,都會在這個文件夾下生成A電腦同名的文件和內容,有的話則會覆蓋同名文件
# A如果文件夾,加上-r,B電腦如果文件的路徑會報錯,B電腦如果文件夾路徑,文件夾不存在的話則會創建這個文件夾且放入A文件夾裏面的內容(至關於將A文件夾挪過去而後重命名),文件夾存在的話,會在這個文件夾下面生成一個和A同名的文件夾,裏面內容一致
scp A電腦:文件路徑 B電腦:文件路徑

# 把本地的 /path/to/local/file 文件傳輸到遠程的 /path/to/remote/file 
scp -P port /path/to/local/file user@remote:/path/to/remote/file

# 也可使用別名
scp /path/to/local/file lab:/path/to/remote/file

# 把遠程的 /path/to/remote/file 下載到本地的 /path/to/local/file
scp lab:/path/to/remote/file /path/to/local/file

# 遠程的默認路徑是家目錄
# 下面命令把當前目錄下的 file 傳到遠程的 ~/dir/file
scp file lab:dir/file

# 加上 -r 命令能夠傳送文件夾
# 下面命令能夠把當前目錄下的 dir 文件夾傳到遠程的家目錄下
scp -r dir lab:

# 別忘了 . 能夠用來指代當前目錄
# 下面命令能夠把遠程的 ~/dir 目錄下載到當前目錄裏面
scp -r lab:dir/ .
複製代碼

若是以爲使用命令行傳輸文件渾身不自在,你還可使用 SFTP 協議。任何支持 SFTP 協議的客戶端都能用你的 SSH 帳號信息登入並管理文件,好比開源的有圖形化界面的FTP客戶端 FileZilla。別忘了,在這些客戶端裏面,你也能夠指定你的私鑰(~/.ssh/id_rsa),而後就能作到無密碼登入了。bash

保持程序在後臺運行

如下命令均在服務器執行

nohup

# 讓程序在後臺運行 好比 nohup node index.js &
nohup 一直執行的命令 &
# 看下任務號 node的那個
ps
# 若是須要終止的話
kill 21455
複製代碼

tmux

tmux更能執行復雜的程序,tmux還能管理多個窗口,窗口切分,複製粘貼等等,mac用戶使用tmux更方便,新建會話tmux -CC,恢復的時候tmux -CC attach

# 服務器上安裝tmux
sudo apt-get install tmux

# 運行tmux,進入會話,此時運行任何東西都不會由於退出ssh而被殺死
tmux

# 暫時離開會話 ctrl+b 再按下d

# 恢復會話
# tmux attach

# tmux命令必須運行在服務器上
複製代碼

以上內容來自ssh免密登陸服務器和scp的使用

基於rsync的部署

參考rsync 的使用方法

scp和rsync的區別

scp命令

1.scp 是 secure copy 的縮寫,用於遠程的文件的複製。

2.參數:

-r: 遞歸複製整個目錄。
複製代碼

3.實例:

scp /home/space/music/1.mp3 username@ip/home/root/others/music     
scp /home/space/music/1.mp3 username@ip/home/root/others/music/001.mp3
複製代碼

若是是遠程複製目錄就加上 -r 參數 便可(重命名目錄,就直接在命令後面添加,前提保證目標地址沒有該目錄)

scp -r /home/space/music/ username@ip:/home/root/others/music_new
複製代碼

把本地music目錄複製到另外一臺服務器的others下,並重命名爲music_new

rsync

1.rsync 是 remote sync 的縮寫,用於linux系統下的數據鏡像備份工具,遠程服務器之間的文件拷貝。 2.參數:

-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rlptgoD。
-v, --verbose 詳細模式輸出。
-z, --compress 對備份的文件在傳輸時進行壓縮處理。
-P, --partial 保留那些因故沒有徹底傳輸的文件,以是加快隨後的再次傳輸。
複製代碼

3.實例:

rsync -avp mylog /home/
複製代碼

scp是至關於複製,黏貼,若是有的話是覆蓋,比較耗時間,不智能。

rsync是複製,若是有重複的文件,會直接跳過,並且他本身的算法優化。

scp是把文件所有複製過去,當文件修改後仍是把全部文件複製過去,rsync 第一次是把全部文件同步過去,當文件修改後,只把修改的文件同步過去。

前端基於scp或rsync的自動部署

一、基於scp,新增部署腳本文件,如deploy.sh

# 壓縮文件,其中 dist爲要上傳的文件所在目錄
echo 壓縮部署包!
tar -zcvf dist.tar.gz dist/

# 上傳到服務器(須要輸入密碼,若是已經進行過私鑰配置,則不用),其中/home/savoygu/gusaifei 爲上傳文件所在目錄
echo 上傳文件
scp -r dist.tar.gz 帳號@服務器ip:服務器上傳路徑

# 登陸到服務器(須要輸入密碼,若是已經進行過私鑰配置,則不用)
# 服務器環境開啓
ssh 帳號@服務器ip -tt << EOF

# 進入目標目錄
cd 服務器上傳路徑
# 解壓
sudo tar -zxvf dist.tar.gz --strip-components 1
# 移除線上壓縮文件
sudo rm -rf

exit
EOF
# 服務器環境結束
echo 上傳完成!

# 移除本地壓縮文件
echo 刪除本地壓縮包!
rm -rf dist.tar.gz
複製代碼

使用rsync同理

二、前端使用腳本

"scripts": {
    "deploy": "cross-env NODE_ENV=production umi build && ./deploy.sh"
  }
複製代碼

可結合gitlabCI,Travis CI實現持續集成,參考

錯誤處理

一、權限問題

.ssh目錄,以及/home/當前用戶 須要700權限,參考如下操做調整
sudo chmod 700 ~/.ssh
sudo chmod 700 /home/當前用戶
.ssh目錄下的authorized_keys文件須要600或644權限,參考如下操做調整
sudo chmod 600 ~/.ssh/authorized_keys
複製代碼

二、StrictModes問題

編輯
sudo vi /etc/ssh/sshd_config
找到
#StrictModes yes
改爲
StrictModes no
複製代碼
相關文章
相關標籤/搜索