SSHを介してファイル転送を行うには? sftpコマンドネットワーク管理の基本Tips

ホスト間で対話形式のファイル転送を行うとき、古くから「FTP」(File Transfer Protocol)が利用されてきましたが、通信内容が暗号化されないという問題があります。「SFTP」(SSH File Transfer Protocol)はSSHの仕組みを使用して安全なファイル転送を可能にする上、内部コマンドもFTPと高い互換性を持つため、扱いやすいことが特徴です。

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

バックナンバー

連載バックナンバー

 本連載では、ネットワーク管理の基本コマンドを順を追って紹介していきます。基本書式と用法、主要なオプション、用例サンプルを示しますので、「man」や「help」代わりに通読し、各コマンドでできることを順次おさらいしてみてください。今回は、「SSH」(Secure Shell)を介して「FTP」(File Transfer Protocol)を実行する「sftp」コマンドを紹介します。

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


安全に対話形式でファイル転送する

sftp [オプション] [ユーザー名@]ホスト名[:ファイル]

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


sftpコマンドの概要

 sftpコマンドでは、通信プロトコルにSSH(Secure Shell)を利用し、対話的なファイル転送を行います。

 指定されたホスト(SSHサーバー)にログインした後、「対話モード」に入ることはFTPと同様ですが、ユーザー認証とデータ転送の両方でSSH通信による安全性が確保されます。

 セキュリティ面はSSHと同等で、認証手順および認証に利用する共通鍵暗号/パスフレーズを共有できます。そのため、利用に際しては「ssh-keygen」コマンドで公開鍵/秘密鍵を作成するなどの準備が必要です。

 なお、sftpコマンドは「SSH上で動くアプリケーション」という位置付けのため、sshの設定ファイル「/etc/ssh/sshd_config」での設定は必要ですが、別途FTPサーバーを稼働させる必要はありません。加えて、同様の理由から、RFCのような仕様標準化のための文書も存在しません。使用するポートもSSHサーバー(一般的には22番)と同じです。

 類似の機能を持つコマンドとして、SSHを用いてファイルコピーを行う「scp」があります。

 scpコマンドは転送速度でsftpより有利とされており、バッチ処理に適していますが、中断したファイルコピーを再開する機能がありません。sftpでは、ファイル転送が中断した場合に再転送が行われます。


sftpコマンドの主なオプション

 sftpコマンドの主なオプションは次の通りです。

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

sftpコマンドでよく使う内部コマンド

 sftpコマンドの書式および内部コマンドは、ftpコマンドに準じています。ダウンロードの「get」やアップロードの「put」、カレントディレクトリを変更する「cd」といった内部コマンドは、同じ書式です。セッション開始後に「help」(または「?」)を実行すれば、内部コマンドの書式を一覧できます。

表2 主な内部コマンド
内部コマンド 意味
! [コマンド] ローカル側のシェルでコマンドを実行する(コマンドを省略するとシェルに入る)
bye sftpを終了する(exitでも同じ意味になる)
cd [パス] サーバー側のカレントディレクトリを変更する
get [ファイル] サーバー上のファイルをローカルにダウンロードする
help ヘルプを表示する(「?」も同じ意味になる)
lcd [パス] ローカル側のカレントディレクトリを変更する
lls ローカル側のファイルリストを表示する
ln シンボリックリンクを作成する
lpwd ローカル側のカレントディレクトリを表示する
ls サーバー側のファイルリストを表示する
mkdir ディレクトリ サーバー側にディレクトリを作成する
put [ファイル] ローカルのファイルをサーバーへアップロードする
pwd サーバー側のカレントディレクトリを表示する
rename [旧ファイル] [新ファイル] サーバー側のファイルを新しい名前に変更する
rm [ファイル] サーバー側のファイルを削除する

sftpでセッションを開始するには?

 リモート(SSHサーバー)側で公開鍵の登録が完了していれば、「ユーザー名@アドレス」の形式でホストの情報を指定してsftpコマンドを実行することで、セッションが開始できます。認証が完了すると、プロンプトは「sftp>」に変化し、内部コマンドを利用したファイル操作が可能になります。ユーザー認証からデータ転送まで一貫して安全性が確保されるのは、sshコマンドやscpコマンドと同様です。

 以下の例では、あらかじめ公開鍵登録が済んでいるホスト「192.168.12.9」に、ユーザー名「shinobu」でSFTPのセッションを開始しています。2行目のメッセージで接続が完了、3行目でsftpを介して内部コマンドを受け付ける対話モードになっています。

$ sftp shinobu@192.168.12.9
Connected to 192.168.12.9.
sftp>

sftpでファイルをダウンロード/アップロードするには?

 セッション開始後は、sftpの内部コマンドを利用してファイル操作を行います。作業完了後は「bye」または「exit」を実行すると、セッションが終了します。

 sftpの内部コマンドは基本的にftpコマンドと同じで、「cd」でカレントディレクトリの変更、「get」でファイルのダウンロード、「put」でファイルのアップロードなど、種類と用法はftpコマンドに準じています。「get」や「put」ではワイルドカードも使用できるため、複数のファイルを安全に転送できます。

 以下の例では、sftpコマンドでセッションを張ったホストから「bird.png」ファイルをダウンロードしています。

sftp> get bird.png 
Fetching /home/shinobu/bird.png to bird.png
/home/shinobu/bird.png       100% 1747KB 873.4KB/s   00:02

 以下の例では、sftpコマンドでセッションを張ったホストのホームディレクトリに、ローカルのカレントディレクトリにある「car.png」ファイルをアップロードしています。

sftp> put car.png
Uploading car.png to /home/shinobu/car.png
car.png                      100% 1747KB   1.7MB/s   00:01    

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

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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