必须使用大写-P参数指定非默认SSH端口,如scp -P 2222 file.txt user@host:/path/;不支持单命令为源和目标分别设不同端口,需分步操作或通过~/.ssh/config配置别名简化。

在 Linux 中使用 scp 进行服务器间文件传输时,若目标服务器 SSH 服务运行在非默认端口(22),必须显式指定端口号,否则会连接失败。
指定端口的基本语法
scp 通过 -P(大写 P)参数指定远程 SSH 端口。注意不要与 ssh 的小写 -p(用于指定本地端口转发)混淆。
- 从本地传到远程(指定端口 2222):
scp -P 2222 file.txt user@host:/path/to/dest/ - 从远程(端口 2222)拉取到本地:
scp -P 2222 user@host:/path/to/file.txt ./ - 两台远程服务器间传输(需本地中转,且两端都可能需指定端口):
scp -P 2222 user1@host1:/data/log.tar.gz -P 12345 user2@host2:/backup/
⚠️ 注意:这种写法不合法 ——scp不支持为“源”和“目标”分别设不同端口的单命令直传。正确做法是分两步,或使用ssh配置别名简化。
通过 SSH 配置文件简化多端口操作
频繁访问非标准端口时,可在 ~/.ssh/config 中预定义主机别名,避免每次输入 -P:
Host srv-a
HostName 192.168.1.100
User admin
Port 2222
Host srv-b
HostName 203.0.113.50
User deploy
Port 12345
之后即可直接使用别名,scp 自动读取配置:
scp file.zip srv-a:/opt/app/-
scp srv-a:/var/log/app.log srv-b:/tmp/(需确保本地能同时访问两台服务器)
常见问题与验证方法
如果传输失败,先确认端口连通性,再排查权限和路径:
- 用
telnet host port或nc -zv host port测试端口是否开放 - 确保远程用户对目标目录有写权限(上传)或读权限(下载)
- 路径中含空格或特殊字符时,对远程路径加单引号:
scp -P 2222 data.tar.gz user@host:'/home/user/my folder/' - 如提示
Permission denied (publickey),检查是否已配置对应端口的 SSH 密钥认证(密钥仍走同一 SSH 连接,端口变化不影响密钥机制)
替代方案:rsync over ssh(推荐用于大文件或增量同步)
若需断点续传、压缩传输或只同步差异,可用 rsync 指定 SSH 端口:
rsync -avz -e 'ssh -p 2222' file.txt user@host:/path/- 同样支持
~/.ssh/config别名,写法更简洁:rsync -avz file.txt srv-a:/path/


















