ssh / scp / rsync
『ssh』・『scp』・『rsync』はリモートホストへの接続・ファイル転送・同期を行うコマンドです。サーバー管理やデプロイ作業に欠かせないツール群です。
構文
SSH でリモートホストに接続します。
ssh ユーザー名@ホスト名
ポートを指定して接続します。
ssh -p ポート番号 ユーザー名@ホスト名
リモートコマンドを実行して終了します。
ssh ユーザー名@ホスト名 "コマンド"
ローカルからリモートへファイルをコピーします(scp)。
scp ローカルファイル ユーザー名@ホスト名:リモートパス
リモートからローカルへファイルをコピーします(scp)。
scp ユーザー名@ホスト名:リモートファイル ローカルパス
ローカルからリモートへ同期します(rsync)。
rsync -avz ローカルディレクトリ/ ユーザー名@ホスト名:リモートディレクトリ/
コマンド・オプション一覧
| コマンド / オプション | 概要 |
|---|---|
| ssh ユーザー@ホスト | 指定したホストに SSH で接続します。 |
| ssh -p ポート | 接続ポートを指定します(デフォルトは22)。 |
| ssh -i 秘密鍵 | 使用する秘密鍵ファイルを指定します。 |
| ssh -L ローカルポート:先:ポート | SSH ポートフォワーディング(ローカル)を設定します。 |
| scp ファイル ユーザー@ホスト:パス | SSH 経由でファイルをコピーします。 |
| scp -r ディレクトリ | ディレクトリを再帰的にコピーします。 |
| scp -P ポート | scp のポートを指定します(大文字 P)。 |
| rsync -a | アーカイブモード(パーミッション・タイムスタンプを保持)で同期します。 |
| rsync -v | 詳細表示モードで同期します。 |
| rsync -z | 転送時に圧縮します。 |
| rsync --delete | 送信元にないファイルを送信先から削除します。 |
| rsync --dry-run | 実際には転送せず、処理内容のシミュレーションを表示します。 |
| rsync -e "ssh -p ポート" | rsync で使う SSH のポートを指定します。 |
サンプルコード
以下の SSH 接続情報を例に説明します。
~/.ssh/config
Host myserver
HostName 192.168.1.100
User deploy
Port 2222
IdentityFile ~/.ssh/id_rsa
エイリアスで SSH 接続します。『~/.ssh/config』に設定しておくとコマンドがシンプルになります。
ssh myserver
リモートでコマンドを実行して、結果をローカルに取得します。
ssh myserver "df -h /" Filesystem Size Used Avail Use% Mounted on /dev/sda1 50G 23G 25G 48% /
ローカルのファイルをサーバーにアップロードします(『scp』)。
scp -P 2222 ./config.json deploy@192.168.1.100:/var/www/app/
ディレクトリを再帰的にコピーします。
scp -r ./dist/ deploy@192.168.1.100:/var/www/html/
『rsync』でデプロイします。まず『--dry-run』でシミュレーションを確認してから実行するのが安全です。
rsync -avz --delete --dry-run ./dist/ deploy@192.168.1.100:/var/www/html/ sending incremental file list ./ index.html css/style.min.css js/common.min.js deleting old-page.html sent 234 bytes received 45 bytes 186.00 bytes/sec total size is 1,234,567 speedup is 4,426.69 (DRY RUN)
シミュレーション結果に問題がなければ、『--dry-run』を外して本番同期を実行します。
rsync -avz --delete ./dist/ deploy@192.168.1.100:/var/www/html/ sending incremental file list ./ index.html css/style.min.css js/common.min.js sent 45,678 bytes received 92 bytes 18,308.00 bytes/sec total size is 1,234,567 speedup is 26.99
バックアップを日付ディレクトリに同期します。
backup_sync.sh
date_dir=$(date +%Y%m%d) rsync -az /var/www/html/ /backup/$date_dir/
bash backup_sync.sh
SSH ポートフォワーディングで、ローカルの 8080 番ポートをリモートの 80 番ポートに転送します。
ssh -L 8080:localhost:80 myserver
概要
デプロイ作業では『$ rsync -avz --delete』が定番です。『--delete』を付けると送信元で削除したファイルが送信先でも削除されます。本番適用前は必ず『--dry-run』で動作確認してください。
SSH 接続情報は『~/.ssh/config』にまとめておくと、コマンドがシンプルになり管理も楽になります。秘密鍵は適切なパーミッション(『$ chmod 600』)を設定してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。