序章

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アクセスをテストします。

  1. ssh sammy@your_server_ip_or_remote_hostname

それが機能する場合は、次のように入力して終了します。

  1. exit

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

  1. sftp sammy@your_server_ip_or_remote_hostname

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

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

  1. sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

これにより、指定したポートを介してリモートシステムに接続されます。

SFTPでヘルプを取得する

最初に学ぶのに最も役立つコマンドは、ヘルプコマンドです。 これにより、他のSFTPコマンドの要約にアクセスできます。 プロンプトに次のいずれかを入力して呼び出すことができます。

  1. help

また

  1. ?

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

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' . . .

次のセクションで表示されるコマンドのいくつかについて説明します。

対応するシェルと同様に機能するいくつかのコマンドを使用して、リモートシステムのファイル階層をナビゲートできます。

まず、現在リモートシステム上にあるディレクトリを見つけて、向きを変えましょう。 通常のシェルセッションと同様に、次のように入力して現在のディレクトリを取得できます。

  1. pwd
Output
Remote working directory: /home/demouser

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

  1. ls
Output
Summary.txt info.html temp.txt testDirectory

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

  1. ls -la
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 . . .

別のディレクトリに移動するには、次のコマンドを発行できます。

  1. cd testDirectory

これでリモートファイルシステムをトラバースできますが、ローカルファイルシステムにアクセスする必要がある場合はどうなりますか? ローカルの場合はlを前に付けることで、コマンドをローカルファイルシステムに向けることができます。

これまでに説明したすべてのコマンドには、ローカルで同等のものがあります。 ローカルの作業ディレクトリを印刷できます。

  1. lpwd
Output
Local working directory: /Users/demouser

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

  1. lls
Output
Desktop local.txt test.html Documents analysis.rtf zebra.html

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

  1. lcd Desktop

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

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

  1. get remoteFile
Output
Fetching /home/demouser/remoteFile to remoteFile /home/demouser/remoteFile 100% 37KB 36.8KB/s 00:01

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

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

  1. get remoteFile localFile

getコマンドは、いくつかのオプションフラグも受け入れます。 たとえば、再帰オプションを指定することで、ディレクトリとそのすべてのコンテンツをコピーできます。

  1. get -r someDirectory

-Pまたは-pフラグを使用して、適切なアクセス許可とアクセス時間を維持するようにSFTPに指示できます。

  1. get -Pr someDirectory

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

リモートシステムへのファイルの転送も同じように機能しますが、putコマンドを使用します。

  1. put localFile
Output
Uploading localFile to /home/demouser/localFile localFile 100% 7607 7.4KB/s 00:00

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

  1. put -r localDirectory

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

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

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

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

  1. !

その後

  1. df -h
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セッションに戻るには、次のように入力します。

  1. exit

これで、SFTPプロンプトが返されるはずです。

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

SFTPを使用すると、ある種のファイルシステムのハウスキーピングを実行できます。 たとえば、リモートシステム上のファイルの所有者を次のように変更できます。

  1. chown userID file

システムのchmodコマンドとは異なり、SFTPコマンドはユーザー名を受け入れず、代わりにUIDを使用することに注意してください。 残念ながら、SFTPインターフェイス内から適切なUIDを知るための組み込みの方法はありません。

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

  1. get /etc/passwd
  2. !less passwd
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番目の列にあります。

同様に、ファイルのグループ所有者を次のように変更できます。

  1. chgrp groupID file

繰り返しますが、リモートシステムのグループのリストを取得するための組み込みの方法はありません。 次のコマンドで回避できます。

  1. get /etc/group
  2. !less group
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番目の列は、最初の列の名前に関連付けられたグループのIDを保持します。 これが私たちが探しているものです。

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

  1. chmod 777 publicFile
Output
Changing mode on /home/demouser/publicFile

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

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

  1. lumask 022
Output
Local umask: 022

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

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

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

  1. ln
  2. rm
  3. rmdir

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

  1. !

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

  1. !chmod 644 somefile

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

  1. bye

結論

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

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

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