SCP连接不上服务器,绝大部分情况下是网络不通、SSH服务未启动、端口被防火墙拦截或密钥认证失败这四类原因造成的。与其对着报错干着急,不如拿张纸把这四类原因挨个画勾排查,绝大多数问题十分钟内能定位。
排查前先搞清楚SCP的工作机制
SCP全称Secure Copy Protocol,它本身不传文件,而是依赖SSH服务来干活,这意味着所有SSH能遇到的问题,SCP都会原样复现,业内专家指出,日常接到的SCP故障工单里,大约七成问题出在目标主机的SSH配置上,剩下三成才是网络和权限的事。
想排查SCP故障,你至少得知道三条命令:
ssh -v user@server_ip:查看SSH握手过程中的详细输出telnet server_ip 22:测试目标端口能否建立TCP连接ss -tlnp | grep sshd:确认本机SSH服务是否在监听
# 先在客户端测网络连通性 ping -c 4 服务器IP # 再测端口是否通 nc -zv 服务器IP 22
SCP报错的信息虽然往往只有一个笼统的”Connection refused”,但排查路径是固定的,走完下面五个模块基本能解决问题。
网络层不通是SCP连不上的头号原因
网络因素导致SCP失败,最典型的表现是连接挂起半天,最后超时。 这跟连不上的感觉完全不一样,SCP会卡住不动,直到客户端等得不耐烦才报错。
跨地域连接时先怀疑安全组和防火墙
如果你是从本地电脑连云服务器,首先检查安全组入站规则。大厂云控制台的安全组默认只放行22端口直连IP,如果你换了出口IP而没更新安全组规则,SCP就会在建立TCP连接阶段被静默丢弃。
本人遇到过最离谱的一次:用户在办公室能正常SCP,回到家就连不上,后来发现是家里宽带的公网IP变了,而安全组规则还锁着办公室的老IP。
局域网内部SCP要查物理链路
办公网内部传输文件时,排查重点就不太一样了:
- 交换机端口有没有做MAC地址绑定
- 网线或Wi-Fi信号质量是否稳定
- 有没有开启AP隔离(无线隔离)功能
这些因素导致的SCP失败,报错信息往往是Operation timed out,前面去ping一下目标IP通常也是不通的。
SCP提示Connection refused的端口与服务排查
当报错明确出现Connection refused,这比超时要好办得多,因为说明网络是通的,只是有人把门关了,这时候需要逐一排查目标服务器的SSH服务状态。

SSH服务真的在跑吗
# 在服务器上执行 systemctl status sshd # 如果没启动 systemctl start sshd systemctl enable sshd
行业共识认为,服务器重启后SSH服务没设置开机自启,是导致SCP连接失败的最隐蔽陷阱。 因为平时不会注意到,直到某天重启服务器后,SCP突然就用不了了。
端口没监听的情况
用netstat -tlnp | grep 22看看22端口是否在监听,如果没有任何输出,说明sshd进程可能已经崩了,查看一下 /var/log/secure 或 /var/log/auth.log,里面通常会留下服务启动失败的蛛丝马迹。
自定义端口类型SCP的坑
如果你用类似scp -P 2222 file user@host:/path的命令,注意是大写-P,小写-p是给ssh用的,这点容易让人误解,如果对方SSH改了端口,但SELinux没放行,也会出现connect refused或者连接被重置的情况。
SSH认证失败导致的SCP无法登陆
网络通了、端口开着、服务也在跑,但SCP还是答应你”Permission denied”,这时候问题出在认证环节。
密码登录连不上时的检查顺序
先确认你用的登录账号在目标机器上真实存在,很多人拿root去连,而不少服务器默认禁用了root远程登录。
排查路径如下:
/etc/ssh/sshd_config里找PermitRootLogin看是否被设置为noPasswordAuthentication是否被改为no(这会导致密码输入正确也登不上去)- 如果你用的是普通用户,试一下密码里有没有特殊字符被shell转义(、
&等)
密钥登录时权限不对
密钥连不上最常见的原因就三个:
~/.ssh/authorized_keys权限大于600~/.ssh目录权限大于700- 公钥粘贴时不小心折行了,导致整段公钥内容中间多了换行符
# 在服务器上执行 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys # 检查公钥内容是否为一行 wc -l ~/.ssh/authorized_keys
如果这个文件输出行数大于1,基本可以确定是公钥内容有问题,用ssh-rsa(或ecdsa-sha2-nistp256)开头的那一串应该是一整行,中间不能换行。
SCP报错信息逐条解读与处理
很多朋友一看SCP报错就慌,其实每条报错都有明确指向,学会看懂它们比瞎猜有用多了。

scp: Connection refused
前面提到过,这条报错说明对方端口没开放,或者SSH服务不在监听,检查顺序是:防火墙规则→sshd服务状态→SSH配置文件是否改错。
# 服务器上检查防火墙 firewall-cmd --list-all # CentOS/RHEL系 systemctl status firewalld # Ubuntu系 ufw status
scp: No route to host
这个词出现时,网络基本处于半瘫痪状态,要么是目标服务器宕机了,要么是路由表出了问题,先用traceroute 服务器IP看看走到哪一跳断掉。
scp: Host key verification failed
这条报错很多人不知道怎么处理,原因很简单:目标服务器的SSH指纹变了,和客户端~/.ssh/known_hosts里记录的对不上。
这在新装的服务器上很常见(比如重装系统后换了密钥),或者在局域网里新克隆的centos/ubuntu虚拟机里也经常出现,解决方式:
# 客户端上执行 ssh-keygen -R 服务器IP # 然后重新连接 scp user@服务器IP:/path/to/file .
scp: /path/: Permission denied
这条报错优先级很高,属于路径权限问题,文件服务器上当前用户没有目标目录的写权限,检查目标目录的属主和属组,确认你登录的用户是否在允许列表里。
SCP故障实例:从超时到连通只差一步
用一个真实常见的场景来串一下排查流程:
某个星期一的早上,你说”SCP传不了文件了”,终端提示Connection timed out,按照下面这个顺序排查,基本能搞定:
# 第一步:网络是否通 ping -c 4 192.168.1.100 # 第二步:端口是否通(用nc比telnet更直白) nc -zv 192.168.1.100 22 # 第三步:如果nc显示open,说明端口通了,那问题大概率出在SSH配置或认证上 ssh -v user@192.168.1.100
最后一个命令的输出会告诉你所有秘密。 你会看到类似debug1: Authentications that can continue: publickey的提示,这就明白地告诉你,对方只接受密钥登录,不接受密码验证。
快速定位SCP故障的检查清单
做个简单的清单,下次出问题直接照着勾选,比盲目穷举省时间。
| 序号 | 检查项 | 检查方法 | 常见误区 |
|---|---|---|---|
| 1 | 服务器是否在线 | ping 目标IP |
能ping通不等于端口通 |
| 2 | 指定端口是否被监听 | telnet IP 22 |
不检查端口直接怀疑认证 |
| 3 | SSH服务是否在运行 | systemctl status sshd |
忽略了服务重启后未自启 |
| 4 | 安全组/防火墙是否放行 | 云控制台/firewall-cmd |
只改防火墙不查云安全组 |
| 5 | 登录凭证是否正确 | ssh -v 连接看输出 |
密码里有特殊字符被shell吃掉 |
| 6 | 目标路径权限是否足够 | ls -ld /目标/目录 |
忽略目录本身写权限 |
| 7 | 是否修改过SSH默认端口 | 检查/etc/ssh/sshd_config |
忘记用-P指定端口 |
这个清单适用于绝大多数中大型企业场景,也适合个人用户拿来排查本地的scp命令问题。
SCP连接不上服务器常见问题解答
问:为什么SCP提示Connection refused但SSH能正常登录?
SCP传输文件时,它会为文件传输单独建立一条新连接,用的是同一个SSH服务,如果SSH能登录但SCP报错,多半是SSH配置里的AllowTcpForwarding被设为no,或者Subsystem sftp被注释掉了,检查这两个配置,确保Subsystem sftp /usr/libexec/openssh/sftp-server是完整且未注释的状态。
问:scp连接不上服务器跟密码里有特殊字符有关吗?
有关系,当你用scp交互式输入密码时,密码里的、、&、括号等字符会被shell的history扩展处理,如果你发现密码用手动输入能登,写在脚本里就登不上,可以在脚本里改用密钥认证,或者用scp的-o选项传入额外的SSH参数来避免shell解析。
问:从本机SCP到另一台机器总是卡住不动,是什么原因?
卡住不动属于典型的三次握手都没完成的状态,先确认目标机器是否在内网,如果跨公网传输,检查两边的MTU(最大传输单元)设置是否一致,或者是否存在路径上的设备做端口限速,排除这些物理干扰后,用ssh -vvv看握手卡在哪一步,通常可以清晰看到TCP层已经完成,但在SSH协议版本交换阶段等待对方回应,这大概率是目标服务器sshd进程再被其他任务阻塞(比如系统负载过高导致无法响应)。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/905996.html

