はじめに
ファイル転送プロトコル(FTP)は、2つのリモートシステム間でファイルを転送するための人気のある、暗号化されていない方法でした。2022年時点で、セキュリティの欠如により、ほとんどの現代のソフトウェアによって非推奨とされ、主にレガシーアプリケーションでのみ使用できます。
セキュアファイル転送プロトコル(SFTP)は、SSHに組み込まれた別個のプロトコルであり、安全な接続を介してFTPコマンドを実装できます。通常、FTPサーバーがまだ必要ないかぎり、そのコンテキストでの代替として機能します。
ほとんどの場合、SFTPはFTPよりも好ましいです。その理由は、基本的なセキュリティ機能とSSH接続上での利用が可能であるからです。FTPは信頼できるネットワーク上でのみ、または限られたケースで使用すべきである、安全でないプロトコルです。
多くのグラフィカルツールにSFTPが統合されていますが、このガイドでは、その対話型コマンドラインインターフェースを使用する方法を示します。
SFTPでの接続方法
デフォルトでは、SFTPはSSHプロトコルを使用して認証し、安全な接続を確立します。そのため、SSHで利用可能な同じ認証方法が利用できます。
デフォルトではパスワードで認証できますが、SSHキーを作成して公開鍵を必要なシステムに転送することをお勧めします。これははるかに安全であり、長期的に時間を節約できます。
すでに行っていない場合は、サーバーにアクセスするためにSSHキーを設定するためのガイドを参照してください。
SSHを使用してマシンに接続できる場合、ファイルを管理するためにSFTPを使用するために必要なすべての要件を完了したことになります。次のコマンドでSSHアクセスをテストしてください:
それが機能する場合は、次のように入力してバックアウトします:
これで、次のコマンドを発行することでSFTPセッションを確立できます:
リモートシステムに接続し、プロンプトがSFTPプロンプトに変わります。
カスタムSSHポート(デフォルトのポート22ではない)で作業している場合は、次のようにしてSFTPセッションを開始できます:
これにより、指定したポートを介してリモートシステムに接続されます。
SFTPでのヘルプの入手
最初に学ぶのに最も役立つコマンドは、ヘルプコマンドです。これにより、他のSFTPコマンドの概要にアクセスできます。次のいずれかをプロンプトで入力することでそれを呼び出すことができます:
または
これにより、利用可能なコマンドのリストが表示されます。
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でのナビゲーション
シェルの対応する機能と同様に機能するいくつかのコマンドを使用して、リモートシステムのファイル階層をナビゲートできます。
まず、現在リモートシステムのどのディレクトリにいるかを把握しましょう。典型的なシェルセッションと同様に、次のように入力して現在のディレクトリを取得できます:
OutputRemote working directory: /home/demouser
現在のディレクトリの内容を別の馴染みのあるコマンドで表示できます:
OutputSummary.txt info.html temp.txt testDirectory
なお、SFTPインターフェースで利用可能なコマンドは、典型的なシェル構文と1対1で対応しておらず、機能が豊富ではありません。ただし、より重要なオプションフラグの一部を実装しています。たとえば、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
. . .
別のディレクトリに移動するには、このコマンドを使用できます:
これでリモートファイルシステムを移動できますが、ローカルファイルシステムにアクセスする必要がある場合はどうすればよいでしょうか?ローカルファイルシステムに向けてコマンドを指示するには、前にl
を付けます。
これまでに説明したすべてのコマンドには、ローカルに対応するものがあります。ローカルの作業ディレクトリを表示できます:
OutputLocal working directory: /Users/demouser
ローカルマシンの現在のディレクトリの内容をリスト表示できます:
OutputDesktop local.txt test.html
Documents analysis.rtf zebra.html
また、ローカルシステムで対話するディレクトリを変更することもできます。
SFTPを使用してファイルを転送する
リモートホストからファイルをダウンロードしたい場合は、get
コマンドを使用できます:
OutputFetching /home/demouser/remoteFile to remoteFile
/home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01
デフォルトでは、get
コマンドはリモートファイルをローカルファイルシステム上の同じ名前のファイルにダウンロードします。
名前を指定してリモートファイルを異なる名前にコピーすることもできます:
get
コマンドはいくつかのオプションフラグも受け入れます。たとえば、再帰オプションを指定することでディレクトリとそのすべての内容をコピーできます:
-P
または-p
フラグを使用して、適切な権限とアクセス時刻を維持するようにSFTPに指示することもできます:
ローカルファイルをリモートシステムに転送する
ファイルをリモートシステムに転送する方法は同じですが、put
コマンドを使用します:
OutputUploading localFile to /home/demouser/localFile
localFile 100% 7607 7.4KB/s 00:00
get
で動作する同じフラグがput
にも適用されます。したがって、完全なローカルディレクトリをコピーするには、put -r
を実行します:
1つの馴染み深いツールは、ファイルのダウンロードとアップロード時に役立つdf
コマンドで、これはコマンドラインバージョンと同様に機能します。これを使用して、興味のある転送を完了するのに十分なスペースがあるかどうかを確認できます:
Output Size Used Avail (root) %Capacity
19.9GB 1016MB 17.9GB 18.9GB 4%
このコマンドにはローカルバリエーションがないことに注意してくださいが、!
コマンドを発行することで回避できます。
!
コマンドは、ローカルシェルに移動させ、ローカルシステムで利用可能な任意のコマンドを実行できます。ディスク使用量を確認するには、次のように入力します:
そして
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セッションに戻るには、次のように入力します:
これでSFTPプロンプトが戻るはずです。
SFTPを使用した簡単なファイル操作
SFTPを使用すると、ファイルシステムのいくつかのメンテナンスを行うことができます。たとえば、次のようにしてリモートシステム上のファイルの所有者を変更できます:
システムのchmod
コマンドとは異なり、SFTPコマンドはユーザー名を受け入れず、代わりにUIDを使用します。残念ながら、SFTPインターフェース内から適切なUIDを知る方法はありません。
代替手段として、ほとんどのLinux環境でユーザー名をUIDに関連付ける/etc/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 は、コロン文字で区切られたファイルの三番目の列にあります。
同様に、ファイルのグループ所有者を変更することができます:
また、リモートシステムのグループのリストを取得する組み込みの方法はありません。次のコマンドを使用して回避することができます:
Outputroot:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
. . .
三番目の列には、最初の列の名前と関連付けられたグループのIDが含まれています。これが私たちが探しているものです。
chmod
SFTP コマンドは、リモートファイルシステムで通常通り機能します:
OutputChanging mode on /home/demouser/publicFile
ローカルファイルの権限を操作するための同等のコマンドはありませんが、ローカル umask を設定して、ローカルシステムにコピーされるファイルの対応する権限を設定できます。
それは lumask
コマンドで行うことができます:
OutputLocal umask: 022
今後、(-p
フラグが使用されていない限り)すべての通常のファイルのダウンロードは 644 の権限を持つようになります。
SFTP は、ローカルおよびリモートシステムの両方でディレクトリを作成することも可能です。lmkdir
および mkdir
を使用します。
ファイルの残りのコマンドは、リモートファイルシステムのみを対象としています:
これらのコマンドは、それぞれのシェルの同等の動作を再現しています。これらのアクションをローカルファイルシステムで実行する必要がある場合は、次のコマンドを使用してシェルに移行できます:
また、単一のコマンドをローカルシステムで実行する場合は、コマンドの前に!
を付けてください。例:
SFTPセッションを終了する際には、exit
またはbye
を使用して接続を閉じます。
結論
SFTPの構文は現代のシェルツールよりもはるかに簡素ですが、レガシーFTPの構文との互換性を提供したり、一部の環境のリモートユーザーが利用可能な機能を注意深く制限するために役立ちます。
たとえば、SFTPを使用して特定のユーザーがSSHアクセスなしでファイルを転送できるようにすることができます。このプロセスの詳細については、シェルアクセスなしでSFTPを有効にする方法のチュートリアルをご覧ください。
FTPやSCPを使用して転送を行うことに慣れている場合、SFTPは両方の利点を活用する良い方法です。すべての状況に適しているわけではありませんが、柔軟なツールです。