バッチなどでファイルのやり取りを安全に実行するには? scpコマンドネットワーク管理の基本Tips

かつて、リモートホストとのファイル転送に利用されていた「rcp」コマンドは、通信内容が暗号化されずそのまま(平文)で送信されるため、安全上の問題がありました。しかし現在では、SSH(Secure Shell)を使う「SCP(Secure Copy)」により、ユーザー認証からデータ転送まで高度なセキュリティを実現できます。

» 2015年05月20日 05時00分 公開
[海上忍@IT]

バックナンバー

連載バックナンバー

 本連載では、ネットワーク管理の基本コマンドを順を追って紹介していきます。基本書式と用法、主要なオプション、用例サンプルを示しますので、manやhelp代わりに通読し、各コマンドでできることを順次おさらいしてみてください。今回は、リモートホストとのファイル転送を安全に実行する「scp」コマンドを紹介します。

 なお、本連載では、執筆時点の最新版Red Hat Enterprise Linux(RHEL)およびCentOS環境で動作を確認しています。また、今回の用法事例はIPv4(Internet Protocol version 4)ネットワークを前提にしています。コマンドのサンプルなどで一部環境に依存した出力例となる場合がありますので、その際には適宜ご自身の環境に合わせて読み替えてください。


安全にリモートホストでファイルコピーする場合の書式

scp [オプション] [[ユーザー名@]ホスト名:]コピー元 [[ユーザー名@]ホスト名:]コピー先

※[ ]は省略可能な引数を示しています。


scpコマンドの概要

 データ転送のプロトコルに「SSH(Secure Shell)」を利用し、ファイルコピーを行います。機能としては、リモートシステム間でファイルコピーするためのコマンド「rcp」と同等ですが、SSHによる暗号化を施すことで、ユーザー認証とデータ転送の両方で安全性を確保します。

 セキュリティ面はSSHと同等で、認証手順および認証に利用する共通鍵暗号/パスフレーズを共有できます。そのため、利用に際しては「ssh-keygen」コマンドで公開鍵/秘密鍵を作成するなどの準備が必要です。ファイアウオールなどでアクセス制限を設けている場合でも、SSHサーバーが使用するポート(一般的には22番)が開いていれば利用可能です。

 基本的な書式は、UNIX系OSで一般的な「cp」および「rcp」コマンドに準じた形式になっています。

 オプションを考慮しない場合、最初の引数にコピー元(オリジナル)ファイルを、2番目の引数にコピー先(複製)ファイルを指定して、コマンドを実行します。ただし、コピー元/コピー先にリモートホスト(SSHサーバー)を指定できるところが、cpコマンドと決定的に異なる点です。

 なお、同じくSSHを用いたファイルコピーを行うコマンドには「sftp」がありますが、scpはrcpおよびcpコマンドと同等の機能を持つことから、バッチ処理に適しています。sftpと比較すると転送速度で有利とされますが、一方では中断した転送を再開できないというデメリットがありますので留意しておきましょう。


主なオプション

 scpコマンドの主なオプションは表1の通りです。

表1 主なオプション
オプション 意味
-1 SSHプロトコルV1を使う
-2 SSHプロトコルV2を使う
-4 IPv4アドレスのみを使う
-6 IPv6アドレスのみを使う
-B バッチモード(パスワードを尋ねない)
-C データを圧縮する
-P 接続するポート番号を指定する
-c 暗号方式を指定する
-i 秘密鍵ファイルを指定する
-l 使用するネットワーク帯域を制限する(単位:Kbps)
-p オリジナルの最終修正時刻やパーミッションを保つ
-r ディレクトリを再帰的にコピーする
-v 冗長表示モード

手元のファイルをリモートにコピーするには?

 手元(ローカル)のファイルをSSHサーバー(リモート)へコピーする場合には、最初の引数にローカルファイル、2番目の引数に「ユーザー名@アドレス:」の形式でリモートホストを指定します。SSHサーバーに公開鍵が登録されている場合はそのまま、未登録の場合はパスワード認証が行われます。

 リモートホストのコロン(:)以下には、転送先のディレクトリパスを指定します。コロン以下を省略した場合には、リモートホストのホームディレクトリ直下(Linuxの場合/home/ユーザー名/****)へコピーされます。

 以下のコマンド実行例では、「hamster.jpg」というファイルを、「192.168.12.9」のユーザー名「shinobu」のホームディレクトリにコピーしています。

$ scp hamster.jpg shinobu@192.168.12.9:
hamster.jpg             100% 2086KB   2.0MB/s   00:00

リモートのファイルをローカルにコピーするには?

 リモートのファイルをローカルにコピーする場合は、最初の引数に「ユーザー名@アドレス:パス」の形でファイルの所在地を指定し、2番目の引数にローカル側のパスを指定します。ワイルドカードを展開する場合は、「shinobu@192.168.12.9:"~/*.jpg"」のように、コロン以降をダブルクォートでくくります。

 以下のコマンド実行例では、「192.168.12.9」のユーザー名「Shinobu」の~/Docs/arc.zipをカレントディレクトリ(.)にコピーしています。

$ scp shinobu@192.168.12.9:Docs/arc.zip .
arc.zip                 100% 8954     8.7KB/s   00:00

パーミッションを保ちつつ、ディレクトリ全体をコピーするには?

 ディレクトリ全体をコピーする場合は、再帰的コピーを行う「-r」オプションを指定します。

 以下のコマンド実行例では、再帰的コピーを行うオプション「-r」と、パーミッションを維持したままコピーするためのオプション「-p」を組み合わせ、「192.168.12.9」のユーザー「shinobu」のホームディレクトリ直下にある「PDFs」ディレクトリを、ローカルのカレントディレクトリにコピーしています。

$ scp -pr shinobu@192.168.12.9:PDFs .
MF201205_078-081.pdf    100% 3849KB 962.3KB/s   00:04    
MF201206_082-085.pdf    100% 4748KB   1.2MB/s   00:04    
MF201207_094-097.pdf    100% 3741KB   1.2MB/s   00:03    
MF201210_084-089.pdf    100% 2587KB 862.5KB/s   00:03    

「ネットワーク管理の基本Tips」バックナンバー

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。