scp命令使用大写-P选项指定非默认SSH端口(如2222),必须置于源路径和目标路径之前,支持本地↔远程双向传输及与-r、-C等选项组合;小写-p为保留文件属性参数,二者功能完全不同。

当远程服务器的 SSH 服务运行在非 22 端口(比如 2222)时,scp 默认会连 22 端口,直接执行会失败。必须显式指定端口号,且语法位置有要求。
用 -P 参数指定端口
scp 使用大写的 -P(注意不是小写 -p)来指定 SSH 端口,这个选项必须放在源路径和目标路径之前,否则会被当作文件名或路径处理。
- 把本地文件传到远程主机(端口 2222):
scp -P 2222 file.txt user@192.168.1.100:/home/user/ - 从远程主机(端口 2222)拉取文件并重命名:
scp -P 2222 user@192.168.1.100:/var/log/syslog ./syslog_backup.log - 复制整个目录(同样需加 -P):
scp -P 2222 -r myfolder/ user@192.168.1.100:/backup/
常见错误提醒
容易出错的地方包括:
- 误用小写 -p:这是旧版 scp 的兼容写法,但新版 OpenSSH 已统一为大写 -P,建议始终用 -P
- 参数顺序放错:比如写成
scp file.txt -P 2222 user@host:/path,会导致命令解析异常,提示“no such file” - 端口号写成字符串:
-P "2222"或-P '2222'虽然多数情况能运行,但不必要,直接写数字更稳妥
配合其他常用选项一起用
实际使用中常和压缩、限速、调试等选项组合:
- 开启压缩(适合文本类小文件):
scp -P 2222 -C file.zip user@host:/tmp/ - 限制带宽为 500KB/s:
scp -P 2222 -l 500 large.iso user@host:/data/ - 显示详细过程(排查连接问题):
scp -P 2222 -v config.yml user@host:/etc/app/
确认远程 SSH 端口是否生效
如果加了 -P 还连不上,先验证端口是否真在监听:
- 登录远程服务器,运行:
ss -tlnp | grep ':2222'或netstat -tuln | grep ':2222' - 检查防火墙是否放行该端口:
sudo ufw status(Ubuntu)或sudo firewall-cmd --list-ports(CentOS/RHEL) - 确认
/etc/ssh/sshd_config中有Port 2222且已重启 sshd:sudo systemctl restart sshd


















