scpコマンドで覚えておきたい使い方7個

以前、sshコマンドの覚えておきたい使い方について記述した事があったが、今回はscpコマンド。 scpはsshプロトコルを利用しているので、環境によってはFTPよりも使い勝手が良いのでよく使われている。今回は、そんなscpコマンドで覚えておきたい使い方について記述する。

1.基本の使い方

基本的には、以下のようにコマンドを実行する。

scp [[ユーザ@]ホスト:]file1 [[ユーザ@]ホスト:]file2

上の実行例を見てもらえればわかるように、ローカルからリモート、リモートからローカル、そしてリモートからリモートへのコピーも可能だ。

●ローカルからリモートへの転送

scp ローカルファイルのPATH ユーザ名@ホスト名:/リモート先のPATH

●リモートからローカルへの転送

scp ユーザ名@ホスト名:/リモート先のPATH ローカルファイルのPATH

●リモートからリモートへの転送

scp ユーザ名@ホスト名:/リモート先のPATH ユーザ名@ホスト名:/リモート先のPATH

ワイルドカードを用いて、複数指定することも出来る。 (ワイルドカードを付けても認識しない場合は、*の前に\を付けてやるといい。)

scp コピー元ファイル(ワイルドカード指定) ユーザ名@ホスト名:/リモート先のPATH

複数のファイルを同時に転送するならば、{}で囲んで指定するといいだろう。

scp {コピー元ファイル,コピー元ファイル,…} ユーザ名@ホスト名:/リモート先のPATH

2016/07/12 追記

また、sshコマンドでも同様だが、初めてアクセスするホストの時に出力される警告を無視する場合は、以下のオプションを付与する。

scp -o "StrictHostKeyChecking=no" ローカルファイルのPATH ユーザ名@ホスト名:/リモート先のPATH
[root@BS-PUB-CENT7-01 dtrx_test]# scp /tmp/test.pl blacknon@XXXX:/tmp
The authenticity of host 'XXXX (XXXX)' can't be established.
ECDSA key fingerprint is 7f:46:f4:c4:e5:3d:6c:b7:d0:05:b1:9e:32:c9:dc:73.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
lost connection
[root@BS-PUB-CENT7-01 dtrx_test]# scp -o "StrictHostKeyChecking=no" /tmp/test.pl blacknon@XXXX:/tmp
Warning: Permanently added 'XXXX' (ECDSA) to the list of known hosts.
blacknon@XXXX's password:
test.pl                                                                                                                100%  564     0.6KB/s   00:00

2.ディレクトリごとコピーする

ディレクトリごと再帰的にコピーする場合、「-r」オプションを用いる。

scp -r コピー元ディレクトリ ユーザ名@ホスト名:/コピー先ディレクトリ

3.更新時間やアクセス時間、パーミッションを保持したまま転送する

ファイルの更新時間やアクセス時間、権限を保持したまま転送する場合は、「-p」オプションを付与する。

scp -p コピー元ファイル ユーザ名@ホスト名:/コピー先ファイル

4.ポート番号を指定して通信を行う

通常、sshプロトコルは22番ポートを利用しているが、サーバの設定で別のポートを使用している場合がある。 そんな時は「-P」オプションを利用してポートを指定すると良いだろう。

scp -P ポート番号 コピー元ファイル ユーザ名@ホスト名:/コピー先ファイル

5.転送を高速化する

暗号化方式を指定する「-c」オプション、通信を圧縮させる「-C」オプションを利用して、より少ないトラフィック量で通信をさせる事も出来る。

●暗号化方式を指定する場合

scp -c 暗号化方式 コピー元ファイル ユーザ名@ホスト名:/コピー元ファイル

●転送を圧縮する場合

scp -C コピー元ファイル ユーザ名@ホスト名:/コピー元ファイル

この辺りについては、以下のブログが詳しく記述している。 大容量ファイルのSCP転送を高速にする方法 - はてなダイアリー

6.転送速度を制限する

「-l」オプションを付与することで、scpに帯域制限をかける事も出来る。単位はkBit/s。

scp -l リミット(kBit/s) コピー元ファイル ユーザ名@ホスト名:/コピー元ファイル

7.踏み台を経由して転送を行う

sshコマンドと同様に、「ProxyCommand」を付与することで踏み台サーバを経由して転送を行わせる事も出来る。 (踏み台サーバには、ncコマンドもしくは比較的新しいSSHコマンドがインストールされている必要がある。)

●ncコマンドを利用する場合

scp -o 'ProxyCommand ssh 踏み台ユーザ名@踏み台ホスト nc %h %p' /コピー元ファイル 転送先ユーザ@転送先ホスト:/コピー先PATH

●比較的新しいsshコマンドの場合

scp -o 'ProxyCommand ssh 踏み台ユーザ名@踏み台ホスト -W %h:%p' /コピー元ファイル 転送先ユーザ@転送先ホスト:/コピー先PATH

番外編 scpが入っていない環境でssh経由でファイルを転送する

scpコマンドだが、 ローカルとリモートそれぞれに入っていないと利用することが出来ない。 そんなときは、scpコマンドをインストールするか、もしくはsshコマンドでscp相当の処理を行う事で対処する。

単純な、ファイル1個を転送する場合は、以下のようにcatもしくはddと組み合わせる事で転送を行う。

●ローカル>リモートの場合

ssh ユーザ名@ホスト名 'cat コピー先PATH' < コピー元ファイル
ssh ユーザ名@ホスト名 'dd of=コピー先PATH' < コピー元ファイル

●リモート>ローカルの場合

ssh ユーザ名@ホスト名 'cat コピー元ファイル' > コピー先PATH
ssh ユーザ名@ホスト名 'dd if=コピー元ファイル' > コピー先PATH

ディレクトリごと転送する場合は、tarと組み合わせて対処すると良いだろう。

●ローカル > リモートの場合

tar -C / -cf - \
  コピー元ファイル(複数指定) |
  ssh ユーザ名@ホスト名 tar -C コピー先PATH -xvf -

●リモート >ローカルの場合

ssh ユーザ名@ホスト名 'tar zcvf - コピー元ディレクトリ' |
 cat | tar xzvf - -C コピー先PATH