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

はじめに

ファイル転送プロトコル(FTP)は、2つのリモートシステム間でファイルを転送するための人気のある、暗号化されていない方法でした。2022年時点で、セキュリティの欠如により、ほとんどの現代のソフトウェアによって非推奨とされ、主にレガシーアプリケーションでのみ使用できます。

セキュアファイル転送プロトコル(SFTP)は、SSHに組み込まれた別個のプロトコルであり、安全な接続を介してFTPコマンドを実装できます。通常、FTPサーバーがまだ必要ないかぎり、そのコンテキストでの代替として機能します。

ほとんどの場合、SFTPはFTPよりも好ましいです。その理由は、基本的なセキュリティ機能とSSH接続上での利用が可能であるからです。FTPは信頼できるネットワーク上でのみ、または限られたケースで使用すべきである、安全でないプロトコルです。

多くのグラフィカルツールに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で対応しておらず、機能が豊富ではありません。ただし、より重要なオプションフラグの一部を実装しています。たとえば、ls-laを追加してより多くのファイルメタデータと権限を表示できます:

  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を知る方法はありません。

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

  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 は、コロン文字で区切られたファイルの三番目の列にあります。

同様に、ファイルのグループ所有者を変更することができます:

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

三番目の列には、最初の列の名前と関連付けられたグループの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 は、ローカルおよびリモートシステムの両方でディレクトリを作成することも可能です。lmkdir および mkdir を使用します。

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

  1. ln
  2. rm
  3. rmdir

これらのコマンドは、それぞれのシェルの同等の動作を再現しています。これらのアクションをローカルファイルシステムで実行する必要がある場合は、次のコマンドを使用してシェルに移行できます:

  1. !

また、単一のコマンドをローカルシステムで実行する場合は、コマンドの前に!を付けてください。例:

  1. !chmod 644 somefile

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

  1. bye

結論

SFTPの構文は現代のシェルツールよりもはるかに簡素ですが、レガシーFTPの構文との互換性を提供したり、一部の環境のリモートユーザーが利用可能な機能を注意深く制限するために役立ちます。

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

FTPやSCPを使用して転送を行うことに慣れている場合、SFTPは両方の利点を活用する良い方法です。すべての状況に適しているわけではありませんが、柔軟なツールです。

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server