【ITニュース解説】Using SCP on a Custom Port (and Avoiding the -p vs -P Mix-Up)
2026年10月07日に「Dev.to」が公開したITニュース「Using SCP on a Custom Port (and Avoiding the -p vs -P Mix-Up)」について初心者にもわかりやすく解説しています。
ITニュース概要
SCPはファイルを安全に転送するコマンド。SSHと同じポートを使うため、カスタムポートへの接続には大文字の`-P`オプションを用いる。SSHの`-p`と異なり、`-p`はファイル属性保持用なので注意が必要だ。`~/.ssh/config`に設定すれば`-P`は省略できる。
ITニュース解説
システムエンジニアを目指す上で、サーバー間でファイルを安全にやり取りする技術は必須だ。その中でも「SCP」は、コマンドラインを使って手軽にファイルを転送できる便利なツールである。SCPは「Secure Copy Protocol」の略で、その名の通り「安全にコピーする」ためのプロトコルだ。この安全性を支えているのが「SSH(Secure Shell)」という技術である。
SCPは単独で通信するのではなく、SSHの通信経路を利用してファイルを転送する。つまり、SSHが利用するネットワークポートをSCPもそのまま使うということだ。SSHは通常、TCPポート22という特定の番号のポートを使って通信する。これはまるで、郵便局の住所が「〇〇町1丁目22番地」と決まっているようなものだ。しかし、セキュリティ上の理由や、一台のサーバーで複数のサービスを動かすといった事情から、SSHの通信ポートをデフォルトの22番から別の番号、例えば2222番などに変更することがよくある。サーバーのSSHサービスが2222番ポートで待ち受けている場合、SCPも当然、その2222番ポートに接続する必要がある。
SCPを使って非標準ポートでファイルを転送するには、コマンドに特別なオプションを追加する必要がある。そのオプションは「-P」だ。これは大文字のピーであることに注意が必要だ。例えば、report.txtというファイルを、SSHポートが2222番に設定されているexample.comというサーバーの/var/tmp/ディレクトリにアップロードする場合、以下のようにコマンドを入力する。
scp -P 2222 report.txt deploy@example.com:/var/tmp/
ここで、deployはサーバーにログインするユーザー名、example.comはサーバーのアドレスを示している。もし、サーバーから自分のパソコンにファイルをダウンロードしたい場合は、リモートのパスを先に指定する。
scp -P 2222 deploy@example.com:/var/tmp/report.txt .
コマンドの最後にある「.(ドット)」は、現在のローカルディレクトリ(今作業している自分のパソコンのディレクトリ)を意味する。この「-P」オプションは、SCPが行うSSH接続のポートを指定するものであり、サーバー側の設定を変更するものではない。
ここで初心者が間違いやすい非常に重要なポイントがある。それは、「-P」と「-p」の違いだ。SCPコマンドにおいて、大文字の「-P」は前述の通り「ポート番号の指定」に使う。しかし、小文字の「-p」は全く別の目的、具体的には「ファイルの更新時刻やパーミッション(読み書きの権限など)を転送元と同じ状態に保つ」ために使われるのだ。
例えば、ポート2222番を使ってファイルを転送し、かつファイルの更新時刻とパーミッションを保持したい場合は、両方のオプションを組み合わせて使うことができる。
scp -p -P 2222 report.txt deploy@example.com:/var/tmp/
この「-P」と「-p」の使い分けは、実はSSHコマンドとは異なる点なので、さらに注意が必要だ。SSHコマンドでサーバーに接続する際、ポートを指定するには小文字の「-p」を使う。
ssh -p 2222 deploy@example.com
SSHコマンドとSCPコマンドを頻繁に使い分ける場合、ポート指定のオプションが大文字か小文字かを常に確認する習慣をつけないと、間違ったオプションでサーバーに接続しようとして、接続エラーに悩まされることになるだろう。
毎回コマンドラインでポート番号を指定するのは面倒だと感じるかもしれない。特に、頻繁に利用するサーバーであればなおさらだ。そんな時は、SSHの設定ファイル「~/.ssh/config」を活用すると非常に便利だ。このファイルに接続先のサーバー情報を登録しておけば、短いエイリアス(別名)を使って接続できるようになる。
例えば、example.comというサーバーのSSHポートが2222番で、deployユーザーで接続する場合、~/.ssh/configファイルに以下のように記述する。
Host staging
HostName example.com
User deploy
Port 2222
このように設定すると、「staging」というエイリアスでそのサーバーにアクセスできるようになる。SSHでログインする場合はssh stagingと入力するだけで済み、SCPでファイルを転送する場合もscp report.txt staging:/var/tmp/のように、ポート指定の「-P」オプションなしで利用できる。SCPはSSHクライアントが読み込むのと同じ設定ファイルを読み込むため、ここで設定したポート番号が自動的に適用されるのだ。このように、ホストごとにユーザー名やポート番号などの詳細な設定を登録しておけば、コマンド入力の手間を省き、誤入力も減らすことができる。
さらに、二つの異なるリモートホスト間でファイルを直接コピーしたいという高度なケースも考えられる。例えば、host1からhost2へファイルを転送するような場合だ。この時、もしhost1とhost2がそれぞれ異なるポート番号を使っていたとしても、一つのSCPコマンドで複数のポートオプションを指定することはできない。現代のOpenSSHでは、このような状況に対応するために、各エンドポイントに「SCP URI」という形式を使用する方法が提供されている。
scp scp://alice@host1:2200/var/tmp/file.txt scp://bob@host2:2222/incoming/
このコマンドでは、host1には2200番ポート、host2には2222番ポートと、それぞれのURI形式の中でホスト名とポート番号を指定できる。これにより、2つのリモートホスト間でファイルを直接コピーする場合でも、異なるポートに対応することが可能になる。ただし、このURI形式は、-Rオプションを使って2つのリモートホストがユーザーのローカルマシンを経由せずに直接通信するように設定されている場合には、ターゲットポートの指定には使えない点に注意が必要だ。
もし、このようなリモートホスト間の転送を頻繁に行う場合は、先ほど紹介した~/.ssh/configファイルに、それぞれのホストのエイリアスを定義する方法がより効率的だ。
Host remote1
HostName host1.example.com
User alice
Port 2200
Host remote2
HostName host2.example.com
User bob
Port 2222
この設定があれば、scp remote1:/var/tmp/file.txt remote2:/incoming/のように、シンプルで分かりやすいコマンドでリモート間のコピーが可能になる。
最後に、SCPでのファイル転送がうまくいかない場合の基本的なトラブルシューティング方法を説明する。まず確認すべきは、サーバーのSSHサービスが、あなたが指定したポートで本当に待ち受けているかということだ。サーバー側でSSHのポートを変更した場合、SSHによるログインだけでなく、SCPでのファイル転送にも影響が出る。
ポートが到達可能かどうかをテストするには、以下のコマンドが役立つ。
LinuxやmacOSを使っている場合は、ncコマンドで確認できる。
nc -zv example.com 2222
WindowsのPowerShellを使っている場合は、Test-NetConnection -ComputerName example.com -Port 2222コマンドを利用する。
Test-NetConnection -ComputerName example.com -Port 2222
これらのコマンドでポートが到達可能と表示された場合、それはTCP接続が成功したことを意味するが、認証や実際のファイル転送が成功するとは限らない点に注意が必要だ。もしポートが到達不能な場合は、サーバーのアドレスが正しいか、ネットワーク経路に問題がないか、そしてサーバーやクライアント側のファイアウォール設定でそのポートがブロックされていないかを確認する必要がある。もしSSHでのログインはできるのにSCPだけが失敗する場合は、ポートの問題ではなく、エラーメッセージの内容や、リモートサーバー上のファイルパスのパーミッション(アクセス権限)に問題がないかを詳しく調べることが重要だ。ポートフラグの指定は正しいにもかかわらず転送に失敗する場合、それは別の原因がある可能性が高い。