ローカルのファイルをフォルダごとリモートサーバーへアップロードするピュアなShellスクリプト

静的ファイルホスティングサービスに__XSERVER__を使っているのですが、
ローカルPCで作成した本番用ファイルをアップロードする際に
一個ずつアップロードするのが面倒だったので、
Shellで一括アップロードするスクリプトを作りました。

## 環境
ローカルPC OS：Windows 10
リモートサーバー：XSERVER

## 事前準備
以下の秘密鍵を作成し、ダウンロードしておく。
→ [XSERVERでSSH接続するための設定手順（公式サイト）](https://www.xserver.ne.jp/manual/man_server_ssh.php)

## スクリプト
```shell:UPLOAD_FILES_TO_XSERVER.sh
SCRIPT_DIR=$(cd $(dirname $0); pwd) # スクリプトが配置されているディレクトリを設定

# XSERVERへのログインパスワードをクリップボードにコピー
# SET /P <NUL="<パスワード>" | clip
<※１パスワードをコピーするbatchファイルへのパス>.bat # パスワードをコピーするbatchファイルへのパス
echo "パスワードをクリップボードにコピーしました。"

# 定数定義
KEY_PATH=<秘密鍵パス> # 秘密鍵パス（事前準備で保管した鍵へのパス）
PORT=<ポート番号> # ポート番号
COPY_FROM=$SCRIPT_DIR/out/* # コピー対象ファイル 今回はout/*にあるファイルをコピー対象とする
USER_NAME=xs<ユーザー名> # ユーザー名
HOST_NAME=<ホスト名>.xserver.jp # ホスト名
REMOTE_ROOT_DIR=$USER_NAME@$HOST_NAME:/home/$USER_NAME/ #リモートパス（どんな命名が良いか思いつかなかったので、適当に付けました。）
PROJECT_DIR=<ドメイン名>/public_html/(<サブドメイン名>)/(<サブフォルダ名>)/ # アップロードフォルダまでのパス
# 例）PROJECT_DIR=paths-are.com/public_html/works.paths-are.com/jamstackblog-with-next-muiv5-microcms/ 
COPY_TO=$REMOTE_ROOT_DIR$PROJECT_DIR # コピー先

# コピー先のファイルを全て削除（前回のデータなどのごみデータを削除する。）
echo "コピー先 $COPY_TO 配下のファイルを全て削除します。パスワードを入力してください。"
ssh -i $KEY_PATH -l $USER_NAME -p $PORT $USER_NAME.xsrv.jp "rm -r $PROJECT_DIR*" #コピー先のフォルダ配下のファイルを削除

# 一括アップロード
echo "$COPY_FROM のファイルを $COPY_TO へアップロードします。パスワードを入力してください。"
scp -i $KEY_PATH -r -P $PORT $COPY_FROM $COPY_TO
read -p "Press [Enter] key to resume."
```

1. 上記スクリプトをご自身のルートプロジェクト直下に配置してください。

1. そして、<>の中を自分の環境に合わせて設定してください。

1. コピー対象ファイルは今回は「ルート/out/*」に設定していますので、自由に変えてください。私はNext.jsの静的htmlファイルをXSERVERにアップロードする想定でこのスクリプトを書きました。

1. <※１パスワードをコピーするbatchファイルへのパス> とありますが、これは
`SET /P <NUL="<パスワード>" | clip` というコードが記載されたbatchファイルを用意します。

```batch:copy_pass.bat
SET /P <NUL="<パスワード>" | clip
```
パスワードは事前準備時の鍵を作成時に設定したパスワード値に置き換えてください。
このbatchファイルを実行すると<パスワード>の文字列がクリップボードにコピーされるようになります。ちょっとした便利テクです。

## 実行
実行します。

```bash:実行.sh
bash UPLOADFILES_TO_XSERVER.sh
```

```bash:こんな感じのログが出力されるはずです。
bash UPLOADFILES_TO_XSERVER.sh 

dir> SET /P ="<パスワード>"  0<NUL  | clip
コピー先 <コピー先パス> 配下のファイルを全て削除します
。パスワードを入力してください。
Enter passphrase for key '<秘密鍵パス>': 
<コピー対象> のファイルを <コピー先パス> へアップロードします。パスワードを入力してください。
Enter passphrase for key '<秘密鍵パス>': 
aeziyoec49v.json                                                                                                                     100% 1769    29.9KB/s   00:00    
ls6ubzxne_4.json                                                                                                                     100% 2460    30.4KB/s   00:00    
y2y-2m1migih.json                                                                                                                    100% 2537    34.5KB/s   00:00    
business.json                                                                                                                        100% 1794    23.4KB/s   00:00    
culture.json                                                                                                                         100%   62     1.0KB/s   00:00    
design.json                                                                                                                          100%   61     1.2KB/s   00:00    
health.json                                                                                                                          100%   61     1.2KB/s   00:00    
opinion.json                                                                                                                         100% 2484    49.2KB/s   00:00    
politics.json                                                                                                                        100%   63     1.2KB/s   00:00    
science.json                                                                                                                         100%   62     1.2KB/s   00:00    
style.json                                                                                                                           100%   60     0.9KB/s   00:00    
technology.json                                                                                                                      100% 1796    32.5KB/s   00:00    
travel.json                                                                                                                          100% 2560    31.8KB/s   00:00    
index.json                                                                                                                           100% 7904   108.7KB/s   00:00    
777-3be30c059f107898767e.js                                                                                                          100%   65KB 338.4KB/s   00:00    
framework-2191d16384373197bc0a.js                                                                                                    100%  128KB 330.6KB/s   00:00    
main-f697fe405f9bcb3ffaff.js                                                                                                         100%   74KB 241.6KB/s   00:00    
404-ff821282b85737b4b90b.js                                                                                                          100%  513     3.6KB/s   00:00    
[id]-d15bed3392fddeca4750.js                                                                                                         100% 6688    81.3KB/s   00:00    
[categoryId]-df6dd1caea01dfee2716.js                                                                                                 100% 7726    96.3KB/s   00:00    
index-55a40d819e141f7366e4.js                                                                                                        100% 7733    81.6KB/s   00:00    
_app-8aa3da5d09aa38ac3826.js                                                                                                         100%   38KB 312.1KB/s   00:00    
_error-737a04e9a0da63c9d162.js                                                                                                       100%  267     6.5KB/s   00:00    
polyfills-a54b4f32bdc1ef890ddd.js                                                                                                    100%   90KB 482.9KB/s   00:00    
webpack-d5ec76dc671ff27c3b07.js                                                                                                      100% 1634    21.2KB/s   00:00    
_buildManifest.js                                                                                                                    100%  630    10.3KB/s   00:00    
_ssgManifest.js                                                                                                                      100%  146     2.4KB/s   00:00    
index.html                                                                                                                           100%   10KB 123.2KB/s   00:00    
index.html                                                                                                                           100%   32KB 299.1KB/s   00:00    
index.html                                                                                                                           100%   33KB 283.4KB/s   00:00    
index.html                                                                                                                           100%   33KB 296.6KB/s   00:00    
index.html                                                                                                                           100%   36KB 266.6KB/s   00:00    
index.html                                                                                                                           100%   30KB 228.7KB/s   00:00    
index.html                                                                                                                           100%   30KB 240.0KB/s   00:00    
index.html                                                                                                                           100%   30KB 251.8KB/s   00:00    
index.html                                                                                                                           100%   37KB 303.6KB/s   00:00    
index.html                                                                                                                           100%   30KB 200.7KB/s   00:00    
index.html                                                                                                                           100%   30KB 256.4KB/s   00:00    
index.html                                                                                                                           100%   30KB 160.7KB/s   00:00    
index.html                                                                                                                           100%   36KB 181.7KB/s   00:00    
index.html                                                                                                                           100%   37KB 241.7KB/s   00:00    
index.html                                                                                                                           100%   52KB 351.7KB/s   00:00    
Press [Enter] key to resume.
```
パスワードを入力するところでは、入力してください。
クリップボードにコピーする手順を踏んでいる方はそのままペーストして「Enter」すれば大丈夫です。

XSERVER管理画面から
「更新日時」を確認したところXSERVERへちゃんとアップロードできてることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640981/a92aa725-a3af-cad5-f742-2a489e2b5b15.png)

## おわり
まあ、今はWinSCPなどのファイルアップロードソフトウェアや、Githubにプッシュしたら自動でサーバーへアップロードするCIとかがあるので、こんなレガシーなやり方する方はあまりいないかもしれませんが、一応こんなやり方もできますね。ということで自分用の備忘録でしたー！