/Linuxコマンド

ネットワーク

SSH・scp・rsync

別のマシンにログインする ssh、鍵の作成、ファイルを送る scp と rsync、~/.ssh/config の書き方。

ssh別のマシンにログインする

ネットワーク越しに別のマシンにログインして操作します。

bash
$ ssh [email protected]
$ ssh -p 2222 [email protected]            # ポートを指定
$ ssh -i ~/.ssh/work_key user@host        # 鍵を指定
$ ssh user@host 'df -h'                   # 1つのコマンドだけ実行して戻る
$ ssh -L 8080:localhost:80 user@host      # ローカルの8080 → 相手側の80(ポート転送)
$ ssh -R 9000:localhost:3000 user@host    # 相手側の9000 → 手元の3000
$ ssh -D 1080 user@host                   # SOCKSプロキシ
$ ssh -J bastion user@internal            # 踏み台を経由

ssh-keygen鍵を作る

SSH のログインに使う鍵(公開鍵と秘密鍵)を作ります。

bash
$ ssh-keygen -t ed25519 -C "[email protected]"      # 新しい鍵(~/.ssh/id_ed25519)
$ ssh-keygen -t ed25519 -f ~/.ssh/work_key       # 名前を付けて作る
$ ssh-keygen -lf ~/.ssh/id_ed25519.pub           # 指紋を表示
$ ssh-keygen -R example.com                      # known_hosts から古い記録を消す

ssh-copy-id公開鍵を相手に登録する

自分の公開鍵をサーバーに登録して、パスワードなしでログインできるようにします。

bash
$ ssh-copy-id [email protected]
$ ssh-copy-id -i ~/.ssh/work_key.pub -p 2222 user@host

これで次回からパスワードなしでログインできます。

~/.ssh/config — 接続先に名前を付ける

~/.ssh/config
Host vps
HostName 194.0.2.10
User alice
Port 22
IdentityFile ~/.ssh/id_ed25519

Host github.com
IdentityFile ~/.ssh/github_key

Host *
ServerAliveInterval 60
bash
$ ssh vps                      # 上の設定で接続
$ scp file.txt vps:~/          # scp や rsync でも名前が使える

ssh-agent / ssh-addパスフレーズを毎回打たない

鍵のパスフレーズを覚えさせて、毎回入力しなくて済むようにします。

bash
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_ed25519
$ ssh-add -l                   # 登録中の鍵

scpファイルをコピーする

SSH を使って、ほかのマシンとファイルをコピーします。

bash
$ scp report.pdf user@host:~/docs/
$ scp user@host:/var/log/app.log .
$ scp -r site/ user@host:/srv/www/
$ scp -P 2222 file user@host:~       # ポートは大文字の -P

rsync差分だけ効率よく同期する

変わった部分だけを効率よくコピーして、フォルダを同期します。バックアップの定番です。

オプション意味
-a権限・日時・リンクを保って再帰的に(ほぼ必須)
-v / -h詳しく表示 / サイズを読みやすく
-z通信を圧縮
-P進捗表示と、途中からの再開
-n実際には何もせず、何が起きるかだけ表示(dry run)
--deleteコピー元にないファイルをコピー先から消す
--exclude除外する
-e 'ssh -p 2222'ssh のオプションを指定
bash
$ rsync -avh src/ backup/                     # ローカルで同期
$ rsync -avzP site/ vps:/srv/www/site/        # サーバーへ
$ rsync -avz vps:/var/log/nginx/ ./logs/      # サーバーから
$ rsync -avn --delete src/ dst/               # まず dry run で確認
$ rsync -av --delete --exclude node_modules --exclude .git ./ vps:~/app/