SFTPを使用してリモートサーバーでファイルを安全に転送する方法

提供:Dev Guides
移動先:案内検索

序章

FTP、ファイル転送プロトコルは、2つのリモートシステム間でファイルを転送するための一般的な暗号化されていない方法でした。 2022年の時点で、セキュリティが不足しているため、ほとんどの最新のソフトウェアでは廃止されており、ほとんどの場合、レガシーアプリケーションでのみ使用できます。

Secure File Transfer Protocolの略であるSFTPは、SSHに組み込まれた別個のプロトコルであり、安全な接続を介してFTPコマンドを実装できます。 通常、FTPサーバーがまだ必要な状況では、ドロップインの代替として機能します。

ほとんどすべての場合、SFTPは、その基盤となるセキュリティ機能とSSH接続にピギーバックする機能があるため、FTPよりも推奨されます。 FTPは安全でないプロトコルであり、限られた場合または信頼できるネットワークでのみ使用する必要があります。

SFTPは多くのグラフィカルツールに統合されていますが、このガイドでは、インタラクティブなコマンドラインインターフェイスを介してSFTPを使用する方法を示します。

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

また

?

これにより、使用可能なコマンドのリストが表示されます。

OutputAvailable 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
OutputRemote working directory: /home/demouser

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

ls
OutputSummary.txt     info.html       temp.txt        testDirectory

SFTPインターフェイス内で使用可能なコマンドは、一般的なシェル構文と1:1で一致するわけではなく、機能が豊富ではないことに注意してください。 ただし、-lalsに追加して、より多くのファイルメタデータとアクセス許可を表示するなど、より重要なオプションのフラグのいくつかを実装しています。

ls -la
Outputdrwxr-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
OutputLocal working directory: /Users/demouser

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

lls
OutputDesktop         local.txt       test.html
Documents       analysis.rtf        zebra.html

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

lcd Desktop

SFTPを使用したファイルの転送

リモートホストからファイルをダウンロードする場合は、getコマンドを使用してダウンロードできます。

get remoteFile
OutputFetching /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
OutputUploading localFile to /home/demouser/localFile
localFile                                     100% 7607     7.4KB/s   00:00

getで機能するのと同じフラグがputに適用されます。 したがって、ローカルディレクトリ全体をコピーするには、put -rを実行できます。

put -r localDirectory

ファイルのダウンロードとアップロードに役立つ使い慣れたツールの1つは、dfコマンドです。これは、コマンドラインバージョンと同様に機能します。 これを使用して、関心のある転送を完了するのに十分なスペースがあることを確認できます。

df -h
Output    Size     Used    Avail   (root)    %Capacity
  19.9GB   1016MB   17.9GB   18.9GB           4%

このコマンドのローカルバリエーションはありませんが、!コマンドを発行することで回避できることに注意してください。

!コマンドは、ローカルシェルにドロップします。ここで、ローカルシステムで使用可能な任意のコマンドを実行できます。 次のように入力して、ディスク使用量を確認できます。

!

その後

df -h
OutputFilesystem      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を知る組み込みの方法はありません。

回避策として、/etc/passwdファイルから読み取ることができます。このファイルは、ほとんどのLinux環境でユーザー名をUIDに関連付けます。

get /etc/passwd
!less passwd
Outputroot: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
Outputroot:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
. . .

3番目の列は、最初の列の名前に関連付けられたグループのIDを保持します。 これが私たちが探しているものです。

chmod SFTPコマンドは、リモートファイルシステムでは通常どおり機能します。

chmod 777 publicFile
OutputChanging mode on /home/demouser/publicFile

ローカルファイルのアクセス許可を操作するための同等のコマンドはありませんが、ローカル umask を設定して、ローカルシステムにコピーされたすべてのファイルが対応するアクセス許可を持つようにすることができます。

これは、lumaskコマンドで実行できます。

lumask 022
OutputLocal umask: 022

これで、ダウンロードされたすべての通常のファイル(-pフラグが使用されていない限り)に644のアクセス許可が付与されます。

SFTPでは、ローカルシステムとリモートシステムの両方で、それぞれlmkdirmkdirを使用してディレクトリを作成することもできます。

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

ln
rm
rmdir

これらのコマンドは、同等のシェルのコア動作を複製します。 ローカルファイルシステムでこれらのアクションを実行する必要がある場合は、次のコマンドを発行してシェルにドロップできることに注意してください。

!

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

!chmod 644 somefile

SFTPセッションが終了したら、exitまたはbyeを使用して接続を閉じます。

bye

結論

SFTP構文は、最新のシェルツールよりもはるかに包括的ではありませんが、従来のFTP構文との互換性を提供したり、一部の環境のリモートユーザーが利用できる機能を慎重に制限したりする場合に役立ちます。

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

FTPまたはSCPを使用して転送を実行することに慣れている場合、SFTPは両方の長所を活用するための優れた方法です。 すべての状況に適しているわけではありませんが、レパートリーに含めることのできる柔軟なツールです。