Posted at

SCPの使い方(permissionで二度とはまらないために) 

More than 1 year has passed since last update.


SCPとは?

sshを使用してネットワーク越しに、ファイルをコピーするコマンドです。


注意点

scpを使う場合に、コピー先に同名のファイルやディレクトリがあった場合に上書きされてしまうので注意


オプション

-i 秘密鍵ファイル  秘密鍵ファイルを使用する際に使用

-P ポート番号    SSHの接続ポート番号が接続先で変更されている場合に使用
-p          コピー元データの更新時間やパーミッション情報を保持させる
-r ディレクトリ内のデータを再帰的にコピーする
-C データを圧縮し、コピーする


scp書式(リモートホストからのローカルへコピー)

scp [オプション] [接続ユーザ]@ホスト名(IPアドレス):コピー元  コピー先

例;scp ec2-user@00.000.00.000: /var/log/nginx/access.log (空白) ./


scp書式(ローカルからリモートへコピー)

scp [ オプション ] コピー元  [接続先ユーザ]@ホスト名(IPアドレス):コピー先


設定ファイル(~/.ssh/config)を使用した方法

scpを利用するときにconfigを設定しておくと、オプションの設定の必要がなくなる



Host [設定名]

Hostname [接続先ホスト名 or IPアドレス]

Port [接続ポート番号](必要があれば)

IdentityFile [秘密鍵](必要があれば)

User [接続ユーザ名] (必要があれば)



Host oda

Hostname ~~~~~~~~~
Port 8080
IdentityFile ~/.ssh/id_ecdsa
User oda

上記の例でいくと

scp oda:/var/log/nginx/access.log  ./

というような感じです。

ちなみに成功すると



access.log-20161021.gz 100% 889KB 888.9KB/s 00:00



のように表示される


はまったところ

[oda]$ scp oda:/var/log/nginx/access.log ./

scp: /var/log/nginx/access.log: Permission denied
Killed by signal 1.

このようなエラーが出てきます。

権限問題です。ここでは権限を変えない解決方法を提示


解決策

ssh  oda (サーバに入る)

sudo -i (rootに)
cd /var/log/nginx (ここではnginxのディレクトリまで移動)
cp <提供するログファイル名> /home/ec2-user (コピーをして対象のファイルを移動させたいパスを指定)
exit

ここで行ったことは権限を変えるのではなく

コピーしてファイルを移動させ、権限のないところに移動させることでscpを可能にするということ

scp oda(host):~/<取得するログファイル名>  ./(移動させるパス)

上記のようにオプションなしでhostを指定できるのはconfigに書いている場合だけです


よく出てくるエラーメッセージ

Permission denied

コピーするディレクトリ、ファイルに書き込み権限がない場合に表示

→ファイルの所有者やパーミッションを確認する必要がある

not a regular file

ディレクトリをコピーする際に[-r]オプションを使用しない場合に表示