ssh / scp / rsync
| 対応: | ssh / scp | 全Linux |
|---|---|---|
| macOS(2001 Cheetah) | ||
| Bash 1.0(1989) | ||
| rsync | 全Linux | |
| macOS(2005 Tiger) | ||
| Bash 1.0(1989) |
『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
バックアップを日付ディレクトリに同期します。
sample_backup_sync.sh
date_dir=$(date +%Y%m%d) rsync -az /var/www/html/ /backup/$date_dir/
実行するコマンドは次の通りです。
bash backup_sync.sh
ポートフォワーディングとは、SSHの暗号化された接続を経由して、別のサーバーのポートに安全にアクセスする仕組みです。
SSH ポートフォワーディングで、ローカルの 8080 番ポートをリモートの 80 番ポートに転送します。
ssh -L 8080:localhost:80 myserver
概要
デプロイ作業では『$ rsync -avz --delete』が定番です。『--delete』を付けると送信元で削除したファイルが送信先でも削除されます。本番適用前は『--dry-run』で動作確認する方法があります。
SSH 接続情報は『~/.ssh/config』にまとめておくと、接続のたびにオプションを指定する手間が省けます。秘密鍵は適切なパーミッション(chmod 600)を設定します。
よくあるミス
よくあるミス1: rsync で末尾スラッシュの有無によって挙動が変わる
rsync ではコピー元のパスの末尾スラッシュの有無で動作が異なります。スラッシュありはディレクトリの中身をコピー、スラッシュなしはディレクトリ自体をコピーします。
rsync -a src/ dest/ (src の中身が dest の中に入る) rsync -a src dest/ (src ディレクトリごと dest/src/ にコピーされる)
意図した方向に合わせてスラッシュの有無を選びます。
よくあるミス2: SCP でポートを -P(大文字)で指定する
SSH は小文字の -p でポートを指定しますが、scp は大文字の -P です。間違えるとエラーになります。
scp -p 2222 file.txt user@server:/tmp/ (-p はパーミッション保持オプション。ポート指定として機能しない)
scp でポートを指定するには大文字の -P を使います。
scp -P 2222 file.txt user@server:/tmp/
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。