サーバーにファイルをアップロードする方法|scpとsftpの違い
サーバーへファイルを安全に送るなら、まず覚えたいのが scp と sftp です。どちらも SSHで暗号化しながら転送できる ので、FTPより安全に扱えます。
結論を先に言うと、1回で素早くコピーしたいなら scp、接続後に一覧を見ながら操作したいなら sftp が向いています。しかも OpenSSH 9.0 以降の scp は、既定で SFTP プロトコルを使って転送します。つまり今は「安全性の差」より、操作スタイルの違い で選ぶ場面が多いです。
scp: ローカルからリモートへ一発で送るのが速いsftp: 接続してlsやcdを使いながら転送できる- どちらも SSH の認証方式を使うので、公開鍵認証と相性がよい
- 古いサーバーで SFTP が使えないときは
scp -Oが必要になることがある
ここがポイント: 迷ったら、定型アップロードは
scp、確認しながらの手動作業や一括処理はsftpで考えると選びやすいです。
前提環境
この記事は、OpenSSH クライアント を使う前提で説明します。macOS や Linux では標準で入っていることが多く、Windows 10 build 1809 以降と Windows 11 でも OpenSSH を利用できます。
確認時点は 2026年4月22日 です。OpenSSH の公式リリースノートでは、OpenSSH 10.3/10.3p1 が 2026年4月2日公開 となっています。なお、scp が既定で SFTP を使う仕様は OpenSSH 9.0 以降 です。
scpとsftpの違い
まずは用途の差を短く整理します。
scpが向いている場面
scp は、ローカルのファイルをそのまま送るコマンドです。コマンド1本で終わるので、次のような作業で手早く使えます。
- ビルドした成果物を本番サーバーへ送る
- ログやバックアップを1ファイルだけ回収する
- シェルスクリプトやCIから定型転送を実行する
代表例です。
scp ./report.csv user@example.com:/home/user/upload/
この1行で、ローカルの report.csv をリモートの /home/user/upload/ へ送れます。
sftpが向いている場面
sftp は、接続後に対話的に操作できるのが強みです。送る前にディレクトリを確認したい、複数ファイルを順番に扱いたい、リモート側で移動や削除もしたい、といった場面で便利です。
- まず接続して保存先を確認したい
lsやpwdで状況を見ながら操作したい- バッチファイルで複数操作をまとめたい
- 転送の再開を使いたい
接続の基本形は次の通りです。
sftp user@example.com
接続後は、たとえば次のように操作します。
pwd
lpwd
ls -l
cd /home/user/upload
put report.csv
bye
まずはscpでアップロードする
最短で送れる方法から見ていきます。
単一ファイルを送る
scp ./image.png user@example.com:/var/www/html/uploads/
ローカルの image.png を、Webサーバー側の uploads ディレクトリへ送る例です。静的ファイルの差し替えや、CSVの受け渡しでよく使います。
ポート番号や秘密鍵を指定する
本番環境では、22番以外のSSHポートや公開鍵認証を使うことが珍しくありません。
scp -P 2222 -i ~/.ssh/id_ed25519 ./app.zip user@example.com:/home/user/releases/
-P: 接続ポートを指定-i: 使用する秘密鍵を指定
scp では 大文字の -P がポート指定 です。小文字の -p は、更新時刻や権限を保持するオプションなので混同しやすい点です。
ディレクトリごと送る
scp -r ./dist user@example.com:/var/www/html/
-r を付けるとディレクトリを再帰的に送れます。フロントエンドのビルド結果や、配布用フォルダ一式を送るときに便利です。
入力例
ローカル側:
./dist/
./dist/index.html
./dist/assets/app.js
転送後のイメージ
リモート側:
/var/www/html/dist/index.html
/var/www/html/dist/assets/app.js
sftpで確認しながらアップロードする
次は、保存先を見ながら操作したいときの sftp です。
接続してからputする
sftp user@example.com
接続後:
cd /home/user/upload
put report.csv
この流れなら、アップロード前に pwd や ls で現在地を確認できます。誤って別ディレクトリへ送る事故を減らしやすいのが利点です。
ディレクトリを送る
sftp の対話モードでは put に再帰オプションを付けてディレクトリを送れます。
put -R dist
scp -r と似ていますが、挙動が完全に同じではありません。OpenSSH のマニュアルでは、scp の再帰転送はツリー走査中に出会ったシンボリックリンクをたどる 一方、sftp は再帰時にシンボリックリンクをたどらない とされています。リンクを含むディレクトリを送るときは結果が変わりやすいので注意が必要です。
転送を再開したいとき
sftp は再開系のコマンドを持っています。
reput large_backup.tar.gz
回線断や大きなファイルの再送が気になる場面では、この違いが実務で効きます。
実務での使い分け
ここがいちばん重要です。迷ったら、次の基準で十分です。
scpを選ぶとき
- 送るファイルと保存先が決まっている
- 手元のメモやスクリプトに残しやすい形で実行したい
- CI、cron、デプロイ補助などで1コマンド化したい
たとえば、毎回同じ場所へ build.zip を送るだけなら scp の方が速いです。コマンド1本で終わるので、運用担当が見ても追いやすくなります。
sftpを選ぶとき
- 接続してファイル一覧を見てから作業したい
- 1回の接続で複数ファイルを整理したい
- 転送、確認、リネーム、削除をまとめてやりたい
- バッチ処理や再開処理を使いたい
特に、アップロード先の構成が毎回少し変わる現場では sftp の方が事故を減らしやすいです。
バッチ処理ならsftpが扱いやすい
sftp は -b でバッチファイルを読めます。定型の複数操作を、手で打たずに実行したいときに便利です。
バッチファイルの例
upload.txt
cd /home/user/upload
mkdir backup
put report.csv
put image.png
ls -l
実行:
sftp -b upload.txt user@example.com
この形なら、アップロード後に一覧確認まで一括で流せます。運用手順書にそのまま載せやすいのも利点です。
よくある失敗と対処
転送コマンドそのものより、接続条件や保存先の前提で止まりやすいです。
Permission denied になる
よくある原因は次の通りです。
- ユーザー名が違う
- 秘密鍵の指定が違う
- サーバー側で公開鍵が未設定
- 保存先ディレクトリに書き込み権限がない
まずはファイル転送の前に、同じ接続条件で ssh user@example.com が通るか確認すると切り分けが早くなります。
ポート指定を間違える
scp と sftp はどちらも ポート指定は -P です。小文字の -p を書くと、意図と違う動作になります。
scp -P 2222 ./file.txt user@example.com:/tmp/
sftp -P 2222 user@example.com
古いサーバーでscpが失敗する
OpenSSH 9.0 以降の scp は既定で SFTP を使います。そのため、相手サーバーが SFTP を提供していない古い環境 では失敗することがあります。
その場合は、旧来の SCP プロトコルを強制する -O を試します。
scp -O ./file.txt user@example.com:/tmp/
ただし、普段から -O を前提にするより、まずはサーバー側の SFTP 利用可否を確認した方が安全です。
scpとsftpの比較まとめ
短く整理すると、違いは次の通りです。
| 項目 | scp | sftp |
|---|---|---|
| 向いている作業 | 一発で送る定型転送 | 確認しながらの手動操作、一括処理 |
| 操作方法 | コマンド一発 | 対話モードまたはバッチ |
| 再帰転送 | -r |
put -R / get -R |
| 再開機能 | 限定的 | reput / reget が使える |
| 最近の既定挙動 | OpenSSH 9.0以降はSFTPで転送 | もともとSFTP |
どちらを覚えるべきか
最初に1つだけ覚えるなら、実務では scp から入る人が多いです。ファイル1個を送る、フォルダをまとめて送る、その2パターンだけでも日常の作業はかなり回せます。
ただ、作業ミスを減らしたいなら sftp も早めに触っておく価値があります。特に本番サーバーや共有サーバーでは、接続してから場所を確認できる こと自体が大きな安全策になります。
最後に要点を絞るとこうです。
- まずは
scpで単発アップロードを覚える - 保存先確認や複数操作が増えたら
sftpを使う - OpenSSH 9.0以降では
scpの既定挙動が変わっているので、古いサーバーでは-Oを思い出す - 本番作業では、転送前に
sshで接続確認し、書き込み先の権限も見る
次に確認すべき実務ポイントは、転送後の権限と所有者が想定通りか です。アップロード自体が成功しても、その後にアプリやWebサーバーが読めなければ作業は完了していません。
