Linux入門:コマンド操作のきほん
scp でファイル転送
毎回 4 つ思い出さないと繋がらない
本番のサーバーは、22 番以外のポートで待ち受けていたり、ログイン名が手元の名前と違っていたり、鍵を複数使い分けていたりします。その結果、接続のたびにこういう行を書くことになります。
ターミナル
ssh -p 2222 -i ~/.ssh/id_ed25519 deploy@app-01.example.com覚えていられません。履歴をさかのぼって探すことになり、探し当てるまでの 30 秒が毎回積み上がります。しかも、あとで届け先が増えたとき、どこを直せばいいのか分からなくなります。
別名を 1 回書いておく
~/.ssh/config に 1 件分の設定を書いておくと、以降は短い別名で呼べます。
プレーンテキスト
Host prod
HostName app-01.example.com
User deploy
Port 2222これだけで ssh prod が通ります。ポートを変更したときも、直すのはこの 1 か所です。同じ書き方で stg や db を並べれば、届け先の一覧が設定ファイルとして残ります。
大事なのは、この別名が SSH を土台に使う他のコマンドでもそのまま効くことです。ファイルを送るときも、覚え直す必要はありません。
送る向きは、書いた順で決まる
scp は SSH の上でファイルをやり取りするコマンドです。cp と同じく、先に書いた方から後に書いた方へ流れます。相手側を指すときは、別名のうしろにコロンとパスを続けます。
ターミナル
# 手元のビルド成果物をサーバーへ置く
scp -r dist/ prod:/var/www/app/
# サーバーのログを手元へ引き取る
scp prod:/var/log/app/error.log ~/work/上と下の違いは、コロンの付いた側が左にあるか右にあるかだけです。ここを逆にすると、手元の新しいファイルが古いもので上書きされます。実行する前に、コロンがどちら側にあるかを一度目で確かめる癖をつけてください。
ディレクトリを丸ごと運ぶときは -r が要ります。付け忘れると、そのディレクトリは黙って無視されます。エラーらしいエラーが出ないまま何も届かないので、送ったつもりで先へ進んでしまいがちです。
送り先のディレクトリは、先に存在している必要があります。無い場合は新しいファイルとして作られてしまい、/var/www/app という名前のファイルの中に中身が書き込まれる、という妙な結果になります。届け先が新しいときは、一度ログインして作ってから送ってください。
小さいファイルが大量にあるときは、そのまま送ると 1 個ごとに手続きが走って遅くなります。先にひとまとめの書庫にしてから送ると、体感で桁が変わります。
ターミナル
tar czf logs.tar.gz logs/
scp logs.tar.gz prod:/tmp/
Permission deniedが出たら鍵の登録、Is a directoryが出たら-rの付け忘れ、No such file or directoryが出たら相手側のパスか書き込み権限を疑います。この 3 つでほとんど片付きます。