URL: https://www.progressiverobot.com/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server-ja/

はじめに

FTP(File Transfer Protocol: ファイル転送プロトコル)は、2つのリモートシステム間の暗号化されていないファイル転送方式として人気がありました。

SFTP(SSH File Transfer Protocol: SSHファイル転送プロトコル、あるいはSecure File Transfer Protocol: セキュアファイル転送プロトコル)はSSHを備えた別のプロトコルで、FTPと同様の働きをしますが、安全な接続を使用します。SFTPの利点は、安全な接続を活用してファイルを転送し、ローカルとリモート両方のファイルシステムを横断できることです。

ほとんどの場合、基本的なセキュリティ機能やSSH接続を利用できることから、SFTPがFTPより好ましいといえます。FTPは安全性の低いプロトコルなため、限定的な場合あるいは信頼できるネットワークでのみ使用すべきでしょう。

SFTPには多くのグラフィカルツールが統合されていますが、このガイドでは、対話型コマンドラインインタフェースを介した使用方法を説明します。

SFTPに接続する方法

sftp illustration for: SFTPに接続する方法

SFTPはデフォルトで、SSHプロトコルを使用して安全な接続を認証・確立します。このため、SSHの認証方法が利用可能です。

パスワード認証は使いやすく、デフォルトで設定されていますが、SSH鍵を作成して公開鍵をアクセスしたいシステムに転送することをお勧めします。こちらの方がはるかに安全であり、長期的に見れば時間を節約できます。

サーバーにアクセスする方法は、SSH鍵をセットアップのガイドをご参照ください。

マシンにSSH接続できるなら、ファイル管理のためにSFTPを使用する要件がすべて整っています。次のコマンドでSSHアクセスをテストします。

				
					
ssh <^>sammy<^>@<^>your_server_ip_or_remote_hostname<^>

				
			

成功したら、次を入力してセッションを終了します。

				
					
exit

				
			

次のコマンドを発行して、SFTPセッションを確立します。

				
					
sftp <^>sammy<^>@<^>your_server_ip_or_remote_hostname<^>

				
			

リモートシステムと接続し、プロンプトがSFTPプロンプトに変わります。

カスタムSSHポート(デフォルトのポート22ではない)で操作している場合、次のようにSFTPセッションを開きます。

				
					
sftp -oPort=custom_port <^>sammy<^>@<^>your_server_ip_or_remote_hostname<^>

				
			

これにより、指定したポートからリモートシステムに接続できます。

SFTPのヘルプ

ヘルプコマンドを最初に覚えるととても便利です。これでSFTPヘルプのサマリにアクセスできます。以下のいずれかをプロンプトに入力するとヘルプコマンドが呼び出せます。

				
					
help

				
			

または

				
					
?

				
			

これは次のような利用可能なコマンドを一覧表示します。

				
					
[secondary_label Output]

Available commands:

bye Quit sftp

cd path Change remote directory to 'path'

chgrp grp path Change group of file 'path' to 'grp'

chmod mode path Change permissions of file 'path' to 'mode'

chown own path Change owner of file 'path' to 'own'

df [-hi] [path] Display statistics for current directory or

 filesystem containing 'path'

exit Quit sftp

get [-Ppr] remote [local] Download file

help Display this help text

lcd path Change local directory to 'path'

. . .

				
			

次のセクションでコマンドをいくつか見ていきます。

SFTPで移動する

ローカルのシェルコマンドと同様に機能する多数のコマンドを使用して、リモートシステムのファイル階層間を見て回ることができます。

まず、今現在自分がリモートシステムのどのディレクトリにいるのか、現在位置を確認しましょう。典型的なシェルセッションと同様に、以下を入力して現在のディレクトリを確認します。

				
					
pwd

				
			
				
					
[secondary_label Output]

Remote working directory: /home/demouser

				
			

リモートシステムの現在のディレクトリの内容を、もう一つの使い慣れたコマンドで表示します。

				
					
ls

				
			
				
					
[secondary_label Output]

Summary.txt info.html temp.txt testDirectory

				
			

SFTPインターフェイスのコマンドが通常のシェルコマンドとは違うこと、それほど機能豊富ではないこと、ただし重要度の高いオプションフラグをいくつか実装していることに留意してください。

				
					
ls -la

				
			
				
					
[secondary_label Output]

drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 .

drwxr-xr-x 3 root root 4096 Aug 13 15:02 ..

-rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history

-rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout

-rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc

drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache

-rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile

. . .

				
			

別のディレクトリに移動するには、次のコマンドを入力します。

				
					
cd testDirectory

				
			

リモートファイルシステムを横断できるようになりましたが、ローカルファイルシステムにアクセスしたい場合はどうでしょうか。先にローカルを示すlを付けて、ローカルファイルシステムにコマンドを向けることができます。

これまで扱ってきたコマンドにはすべてローカルで同等のコマンドがあります。ローカルの作業ディレクトリをプリントできます。

				
					
lpwd

				
			
				
					
[secondary_label Output]

Local working directory: /Users/demouser

				
			

ローカルマシンのカレントディレクトリの内容を一覧表示できます。

				
					
lls

				
			
				
					
[secondary_label Output]

Desktop			local.txt		test.html

Documents		analysis.rtf		zebra.html

				
			

また、ローカルシステムでやりとりするディレクトリを変更することもできます。

				
					
lcd Desktop

				
			

SFTPによるファイル転送

リモートとローカルのファイルシステムを行き来できても、2者間でファイル転送できなければ有用性が限られます。

リモートファイルをローカルシステムに転送

リモートホストからファイルをダウンロードするには、次のコマンドを入力します。

				
					
get remoteFile

				
			
				
					
[secondary_label Output]

Fetching /home/demouser/remoteFile to remoteFile

/home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01

				
			

ご覧のとおり、デフォルトでは、getコマンドでリモートファイルをローカルファイルシステムに、同じファイル名でダウンロードします。

リモートファイルの後に名前を指定すると別名でコピーできます。

				
					
get remoteFile localFile

				
			

getコマンドにもオプションフラグがいくつかあります。たとえば、再帰オプションを指定して、ディレクトリとその配下のコンテンツをすべてコピーできます。

				
					
get -r someDirectory

				
			

-Pまたは-pフラグを使用して、適切なパーミッションとアクセス時刻の保持をSFTPに指示できます。

				
					
get -Pr someDirectory

				
			

ローカルファイルをリモートシステムに転送

ファイルのリモートシステムへの転送は、「put」という名前にふさわしいコマンドで簡単に行なえます。

				
					
put localFile

				
			
				
					
[secondary_label Output]

Uploading localFile to /home/demouser/localFile

localFile 100% 7607 7.4KB/s 00:00

				
			

getで利用可能なフラグがputでも利用できます。そのため、ローカルディレクトリ全体をコピーするには、次を発行します。

				
					
put -r localDirectory

				
			

注:現在、Ubuntuリリース(少なくとも 14.04 から15.10)と一緒に出荷されたOpenSSHのバージョンに、上記のコマンドが正しく動作しないバグがあります。OpenSSHのバグバージョンで、上記のコマンドを発行してサーバーにコンテンツを転送すると、次のエラーが表示されます。Couldn't canonicalise: No such file or directory

この問題を回避するにはまず、mkdir localDirectoryを入力して、リモート側に転送先ディレクトリを作成します。その後、上記のコマンドはエラーなく完了するはずです。

ファイルをダウンロード・アップロードする際に便利なよく知られたツールとして、コマンドラインバージョンと似た機能を持つdfコマンドがあります。このコマンドで、転送を完了するのに十分な空きスペースがあるか確認できます。

				
					
df -h

				
			
				
					
[secondary_label Output]

 Size Used Avail (root) %Capacity

 19.9GB 1016MB 17.9GB 18.9GB 4%

				
			

このコマンドはローカルで使えないことに注意してください。ただし、!コマンドを発行することで解決できます。

!コマンドで、ローカルシステムで有効などんなコマンドでも実行できるローカルシェルに移動します。次のように入力してディスクの使用量を確認できます。

				
					
!

				
			

次に

				
					
df -h

				
			
				
					
[secondary_label Output]

Filesystem Size Used Avail Capacity Mounted on

/dev/disk0s2 595Gi 52Gi 544Gi 9% /

devfs 181Ki 181Ki 0Bi 100% /dev

map -hosts 0Bi 0Bi 0Bi 100% /net

map auto_home 0Bi 0Bi 0Bi 100% /home

				
			

他にもローカルコマンドなら何でもが期待通り機能します。SFTPセッションに戻るには、次を入力します。

				
					
exit

				
			

SFTPプロンプトに戻るはずです。

SFTPを使用した簡単なファイル操作

SFTPを使用して、ファイル階層を操作する際に役立つ基本的なファイルメンテナンスができます。

たとえば、リモートシステムのファイルの所有者を変更するには次のように入力します。

				
					
chown userID file

				
			

ここで、システムのchmodコマンドとは異なり、SFTPコマンドはユーザー名を受け付けず、代わりにUIDを使用することがわかります。残念ながら、SFTPインターフェイスで正しいUIDを知るのは容易ではありません。

解決策として次のように入力します。

				
					
get /etc/passwd

!less passwd

				
			
				
					
[secondary_label Output]

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/bin/sh

bin:x:2:2:bin:/bin:/bin/sh

sys:x:3:3:sys:/dev:/bin/sh

sync:x:4:65534:sync:/bin:/bin/sync

games:x:5:60:games:/usr/games:/bin/sh

man:x:6:12:man:/var/cache/man:/bin/sh

. . .

				
			

!を単独で入力せず、ローカルシェルコマンドのプレフィックスとして入力したことに注目してください。 これで、ローカルマシンで利用可能などんなコマンドでも実行でき、先に発行したローカルのdfコマンドとも合わせて使用可能です。

UIDはファイルのコロン記号で区切った3列目になります。

同様に、ファイルのグループ所有者を変更するには次のように入力します。

				
					
chgrp groupID file

				
			

ここでも、リモートシステムのグループの一覧取得は容易ではありません。これは次のコマンドで解決できます。

				
					
get /etc/group

!less group

				
			
				
					
[secondary_label Output]

root:x:0:

daemon:x:1:

bin:x:2:

sys:x:3:

adm:x:4:

tty:x:5:

disk:x:6:

lp:x:7:

. . .

				
			

3列目が、1列目の名前に関連付けられたグループのIDになります。これが探していたものです。

ありがたいことに、chmodコマンドはリモートファイルシステムで期待通りに機能します。

				
					
chmod 777 publicFile

				
			
				
					
[secondary_label Output]

Changing mode on /home/demouser/publicFile

				
			

ローカルファイルのパーミッションを操作するコマンドはありませんが、ローカル システムにコピーされたファイルがすべて適切なパーミッションを持てるように、ローカル umaskを設定できます。

lumaskコマンドを実行します。

				
					
lumask 022

				
			
				
					
[secondary_label Output]

Local umask: 022

				
			

ダウンロードしたすべての通常のファイル(-pフラグが使用されていない限り) のパーミッションは644になります。

SFTPでは、ローカルとリモートの両システムに、それぞれlmkdirmkdirコマンドでディレクトリを作成できます。これは期待通りに機能します。

残りのファイルコマンドは、リモートファイルシステムのみを対象にします。

				
					
ln

rm

rmdir

				
			

これらのコマンドは、シェルバージョンの基本的な動作を模倣しています。ローカルファイルシステムでこれらのアクションを実行したい場合、次のコマンドでシェルに移動できることを覚えておいてください。

				
					
!

				
			

あるいは次のように、コマンドの前に!を付けて、ローカルシステムに対して単独のコマンドを実行します。

				
					
!chmod 644 somefile

				
			

SFTPセッションが終了したら、exitまたはbyeで接続を切ります。

				
					
bye

				
			

まとめ

SFTPは簡素なツールですが、サーバーの管理やサーバー間のファイル転送に非常に便利です。

たとえば、SFTPを使用して、特定のユーザーがSSHアクセスなしにファイル転送できるようにできます。このプロセスの詳細については、チュートリアルシェルアクセスせずにSFTPを有効にする方法を参照してください。

FTPまたはSCPを使用したファイル転送に使い慣れている場合、SFTPなら両方の強みを生かせます。すべての状況に対応するわけではありませんが、柔軟なツールとしてレパートリーに入れておくことをお勧めします。