SSH接続でリモートのPCに接続し、計算やコマンド操作ができるようになると、次に直面するのがファイル転送の問題です。私も実際に「SSHで接続できているのに、なぜローカルのファイルがリモートから見えないのか?」という疑問にぶつかりました。
1. SSHとファイル共有は別物だった
SSH接続でリモートPCにログインし、計算を実行できる状態になりました。しかし、ローカルにあるファイルをリモート側から直接参照できません。「接続できているのに、なぜ?」と感じました。
調べてみると、SSHは「リモート操作の仕組み」であって、「ファイル共有の仕組み」ではないとわかりました。これが理解の第一歩です。
1.1. SSHの役割
SSHは、離れた場所にあるコンピュータを操作するための通信手段です。例えるなら、電話で誰かに指示を出すようなものです。電話で話せても、相手のデスクの上にある書類が自動的に自分の机に現れるわけではありません。
同様に、SSH接続が確立していても、ローカルとリモートのファイルシステムは最初から分離されています。ファイルを送るには、別の手段が必要です。
2. FTPではなくSFTPを使う理由
最初に考えたのは、「SSH接続できるPCにFTPサーバーを入れられないか?」という方法でした。
技術的には可能です。
しかし調べていくと、FTPには大きな問題があるとわかりました。
FTPは通信内容が平文で送信されます。
つまり、パスワードやファイルの中身が暗号化されずにネットワークを流れます。
せっかくSSHという安全な接続手段があるのに、わざわざ危険な方法を追加するのは本末転倒です。
2.1. SFTPという選択肢
SSH環境では、SFTPという仕組みがすでに使えます。
SFTPは「SSH File Transfer Protocol」の略で、SSH接続を使ってファイルを転送するプロトコルです12。
重要な点は、SFTPは追加設定がほぼ不要だということです。SSHサーバーが動いていれば、多くの場合SFTPも使えます。ポート番号もSSHと同じ(通常は22番)で、認証方法も共通です3。
安全で、手間もかからない。FTPを入れる理由はありませんでした4。
2.2. 追加設定が不要な理由
多くのSSHサーバーは、デフォルトでSFTPをサポートしています5。
OpenSSHの場合、設定ファイル(/etc/ssh/sshd_config)に以下のような記述があれば、SFTPが有効です。
Subsystem sftp /usr/lib/openssh/sftp-server
この行がコメントアウトされていなければ、SSH接続ができる環境ならSFTPも使えます。
3. 転送方法は3つある
SFTPを使うとわかったところで、具体的な転送方法を調べました。主に3つの選択肢があります。
3.1. 1. scpコマンド – 単発コピー向け
scpは、ファイルを一発でコピーするコマンドです。使い方はシンプルで、以下のような形式です。
scp ローカルのファイル user@host:/リモートのパス
逆に、リモートからローカルへ取得する場合は、
scp user@host:/リモートのファイル ローカルのパス
とします。
scpの特徴は、コピーして終わりという点です。対話的な操作はできませんが、スクリプトに組み込みやすく、単純な転送には便利です。
コマンドでの転送では、パスの指定ミスが起きやすいです。特に、scpでローカルとリモートを逆にしてしまうと、意図しない上書きが発生します。
最初は-nオプション(実際には転送せず、動作を表示)で確認したり、FileZillaで先に確認してからコマンドを実行したりしていました。
3.2. 2. sftpコマンド – 対話的操作向け
sftpは、リモートとローカルの両方のファイル構造を見ながら操作できるコマンドです。
sftp user@host
Code language: CSS (css)
で接続すると、プロンプトが表示されます。ここで使えるコマンドは、以下のような区別があります。
ls,cd,pwd– リモート側の操作lls,lcd,lpwd– ローカル側の操作
頭にlが付くとローカル(Local)側の操作になります。この区別が、最初は混乱しやすいポイントでした。
ファイルの転送はget(リモート→ローカル)とput(ローカル→リモート)を使います。
sftp> get リモートのファイル
sftp> put ローカルのファイル
Code language: JavaScript (javascript)
構造を確認しながら作業できるため、複数ファイルを扱う場合や、パスを確認しながら進めたい場合に向いています。
リモート側でファイルを作成する際、書き込み権限がないディレクトリを指定するとエラーになります。事前にsftpで接続してpwdで現在地を確認し、書き込み可能な場所を把握しておくと、スムーズです。
3.3. 3. FileZilla – GUI操作向け
FileZillaは、グラフィカルなインターフェースでファイル転送ができるツールです。
設定方法は簡単です。
- 「ファイル」→「サイトマネージャー」を開く
- 「新しいサイト」を作成
- プロトコルを「SFTP」に設定
- ホスト名、ユーザー名、パスワード(または鍵)を入力
- ポート番号は通常22番
接続すると、左側にローカル、右側にリモートのファイル一覧が表示されます。ドラッグ&ドロップでファイルを転送できるため、視覚的にわかりやすく、操作ミスも減ります。
コマンドに慣れていない場合や、大量のファイルを整理しながら転送する場合には、FileZillaが最も使いやすいと感じました。
4. 同期が必要なときはrsyncを使う
ここまでの方法は、ファイルを「転送する」ものです。
しかし、「フォルダを指定して同期したい」という要望も出てきました。
SFTPそのものには、同期(差分だけを転送する)機能はありません。
毎回すべてのファイルを転送することになります。
同期には、rsyncというツールが一般的です6。
rsyncはSSH経由で使えます7。
rsync -avz -e ssh user@host:/リモートのパス /ローカルのパス
Code language: JavaScript (javascript)
オプションの意味は以下の通りです。
-a– アーカイブモード(パーミッションやタイムスタンプを保持)-v– 詳細表示-z– 圧縮転送-e ssh– SSH経由で転送
rsyncは、変更があったファイルだけを転送するため、大量のファイルを扱う場合に効率的です。定期的なバックアップや、開発環境とサーバー間の同期に向いています。
5. まとめ
SSH接続とファイル転送は、別の仕組みです。SSHはリモート操作、ファイル転送にはSFTPやscpを使います。
この切り分けを理解すると、「なぜファイルが見えないのか?」という疑問が解消され、適切な方法を選べるようになります。
転送方法は、状況に応じて選びます。
- 単発のコピー →
scp - 対話的な操作 →
sftp - GUI操作 → FileZilla
- 同期 →
rsync
それぞれの特性を理解し、使い分けることで、作業が整理され効率も上がりました。
最初は「接続できているのに、なぜ?」という疑問から始まりましたが、調査と検証を通じて、SSH環境でのファイル転送の全体像がつかめました。同じ疑問を持つ方の参考になれば幸いです。
- SFTPは「SSH File Transfer Protocol」の略で、IETFによってSSH-2の拡張として設計されたプロトコルです。 – SSH File Transfer Protocol – Wikipedia
- SFTPはIETFのSECSHワーキンググループによってゼロから設計された新しいプロトコルであり、FTP上で実行されるわけではありません。内部的な仕様や実装方式はFTPとは異なり、直接の互換性はありません。 – SFTP 【SSH File Transfer Protocol】
- SFTPはSSH接続上で動作するため、デフォルトのポート番号はSSHと同じTCP/22を使用します。 – Secure File Transfer Protocol とは? SFTP の説明 – AWS
- FTPは標準設定では通信内容が暗号化されないため、認証情報やデータが平文で流れ、盗聴や改ざんのリスクがあります。 – SFTPとは? わかりやすく10分で解説|ネットアテスト
- OpenSSHの場合、設定ファイル(/etc/ssh/sshd_config)に「Subsystem sftp /usr/lib/openssh/sftp-server」のような記述があれば、SFTPが有効になっています。 – SFTPとは。安全なファイル転送の方法、FTPとの違いを解説! | ミライサーバーのススメ
- rsyncは変更時刻を利用して差分を検知し、更新されたファイルのみを転送する高速増分ファイル転送ユーティリティです。 – Rsyncでローカルとリモートのディレクトリを同期する方法 | DigitalOcean
- rsyncは「-e ssh」オプションを指定することで、SSH接続を経由してリモートサーバーとファイル同期ができます。 – SSH経由でrsyncする方法とは?rsyncの基本的な使い方や各種オプションの使い方を紹介! | テックマガジン from FEnetインフラ