当前位置:首页 > 云服务器 > 正文

SCP为什么一进服务器就会被踢掉,SCP进服被踢怎么办

SCP一进服务器就被踢掉,核心原因几乎都是服务端配置限制、认证方式冲突或触发安全防护机制,而不是SCP命令本身出了问题。


为什么SCP连上就掉,服务器到底做了什么

很多朋友都遇到过这个场景:本地执行scp命令,输入密码后连一秒都不到,终端直接提示Connection closed或者kex_exchange_identification,这种感觉就像你刚伸手去敲门,门内的人看了一眼就关门了,SCP的传输过程分为连接建立、身份认证、文件传输三个阶段,被踢掉的高发区集中在第一和第二阶段。

SCP被踢的第一嫌疑:SSH服务的并发连接限制

SCP完全基于SSH协议传输,所以它受sshd_config文件约束,业内专家指出,服务器默认的MaxSessions是10,MaxStartups是10:30:100,这两个参数决定了服务器能同时接纳多少SSH会话,当你的服务器被扫描工具频繁探测,或者有多个终端连接占用会话时,新进来的SCP请求会直接触发drop策略,表现就是“一进去就被踢”。

常见原因拆解如下:

  • 服务器/etc/ssh/sshd_config中设置了MaxSessions过小(比如2),导致并发不足。
  • MaxStartups的随机早丢机制开启了,服务器负载一高,新的SCP连接被优先丢弃。
  • 登录IP触发了DenyUsers或AllowUsers的白名单限制,认证阶段就被直接掐断。

第二个原因:密钥交换算法与客户端不匹配

SCP客户端的OpenSSH版本如果过旧,或者服务器的sshd_config强制只允许某些KexAlgorithms(密钥交换算法),双方在协商阶段会各自僵持不下,比如一台新装的CentOS Stream服务器默认禁用了diffie-hellman-group1-sha1,而你的Windows笔记本自带的旧版scp客户端还在用这个老算法,服务器会直接拒绝继续握手。

排查命令: 在客户端执行ssh -v user@server,观察输出中是否出现no matching key exchange method字样,如果有,基本可以断定就是这个原因,解决办法是客户端指定算法,或者服务端放行对应算法。

第三个高频原因:SSH服务端的ForceCommand或子系统限制

有些服务器的运维为了安全,在sshd_config里给特定用户配置了ForceCommand,比如强制执行某个脚本或进入某个容器,当你用scp连接时,服务器强制执行的命令替代了SCP的

sftp-server子系统的正常流程,整个会话就会在认证完成后瞬间被关闭,看起来就像是“刚进服务器就被踢”。

提示:执行which scp并确认服务端Subsystem sftp配置是否有异常,是这类问题最常见的突破口。


排查SCP被踢的实操步骤:从日志到命令一条龙

与其乱猜,不如按顺序排查,下面这些步骤能覆盖绝大多数“SCP进了就被踢”的场景。

第一步:查看服务端SSH认证日志

SSH认证日志是排查的第一手资料,用root登录服务器,执行:

tail -f /var/log/secure # CentOS/RHEL tail -f /var/log/auth.log # Debian/Ubuntu

然后在新终端重新发起SCP连接,观察日志中出现的具体错误码,常见三种输出:

  • Connection reset by IP:说明连接被服务器的TCP层重置,通常是防火墙或/etc/hosts.deny规则在起作用。
  • Authentication failed:说明认证阶段没过,密码或密钥有问题。
  • Received disconnect: 2: Too many authentication failures:说明客户端提供的密钥过多,服务器达到了认证次数上限。

第二步:检查SSH守护进程的配置有效性

不要靠肉眼判断sshd_config内容,直接测试:

sshd -t

如果输出错误,说明配置文件语法不对,强行重启SSH服务反而会让服务器拒绝所有SSH连接,确认无误后,重启sshd服务:

systemctl restart sshd

第三步:客户端用详细模式直连观察

在客户端用以下方式连接,可以直观看到断开的一瞬间发生了什么:

scp -v -o ConnectTimeout=10 file.txt user@server:/tmp/

如果输出末尾出现Transferred: sent 0, received 0 bytes,说明在认证之后还没开始传数据就被踢了,符合前文提到的ForceCommand或Subsystem问题,如果输出中报Connection timed out,说明网络层就过不去。

第四步:用SFTP命令替代SCP做对比测试

SCP和SFTP两者虽然都走SSH,但SFTP依赖的是独立的子系统进程,如果你执行scp被踢,但执行sftp user@server能正常登录并交互,说明SSH服务本身正常,问题在于SCP子系统路径失效,很多服务器为了安全会直接禁用

scp命令而保留sftp,此时可以用sftp下载文件,或者干脆改用rsync。


换一个思路:有时候该考虑用rsync替代scp

如果服务器配置不方便改动,而你的生产环境又特别依赖安全的文件传输,那么rsync over SSH是更稳定、也更能抗断流的选择。

rsync对比scp的现实优势

对比项 scp rsync over SSH
断点续传 不支持 支持,中断后重新执行可继续
差量传输 不支持,全量拷贝 支持,只传有变化的部分
大文件传输稳定性 较弱,长连接易断 较强,断开后重跑即可续传
传输压缩 需要手动指定-C 自动支持-z压缩
服务端额外配置 无需 需要在服务端安装rsync

值得注意的是,rsync在传输大目录时对CPU占用相对较高,但稳定性远超scp,很多企业级服务器在做跨地域数据同步时,行业共识认为rsync的增量校验机制远比scp可靠。

rsync被踢了怎么办

别慌,rsync被踢的本质和scp一样,都是SSH层断开,使用以下命令可以优雅处理:

rsync -avzP --partial --timeout=60 /local/path user@server:/remote/path

其中--partial保留已传输的部分,--timeout控制空闲超时,如果传输持续中断,可以配合screen或tmux在后台运行,避免终端关闭导致进程被挂断,这一步是很多运维实际生产环境中的常规操作路径。


修改服务端配置来根治SCP被踢问题

如果你确实需要继续使用scp,那么修改服务端配置是治本方案,建议按权重依次操作。

调整SSH并发与认证参数

在/etc/ssh/sshd_config中增加或修改以下参数:

MaxSessions 20 MaxStartups 30:50:100 LoginGraceTime 30 MaxAuthTries 3

LoginGraceTime表示登录超时秒数,过短会导致稍慢一点就被踢。MaxAuthTries表示单次连接允许认证次数,部分客户端会自动尝试多个密钥,若设置过小,会被服务器判定为暴力免费而强踢。

关闭PAM模块的异常限制

部分服务器启用了pam_limits.so,对用户可打开的文件数、进程数有严格上限,当你的SSH会话在认证期间申请资源时,如果超过了/etc/security/limits.conf中的nofile限制,连接会被强制终止,检查是否有以下行:

soft nofile 1024 hard nofile 2048

如果确认是资源限制导致,调大对应值并重启sshd服务即可解决。

处理IP被临时封禁的情况

如果多次密码错误,或者你的IP属于IDC机房常用出口段,服务器上的fail2ban自动封禁脚本可能已经将你拉黑,此时需要登录服务器执行:

fail2ban-client set sshd unbanip 你的IP

这个操作的网络上有比较多的教程,也是很多新手往往忽略的地方本地折腾半天,最后发现是封禁策略在捣乱。


SCP被踢无法连接的典型场景问答

我的scp提示Connection closed by remote host,但网站的SSH终端能正常登录,这是为什么?

如果交互式SSH登录正常,而SCP被踢,优先排查/etc/ssh/sshd_config中的Subsystem sftp配置,尝试在客户端连接时加上-s参数指定子系统:

scp -s sftp file.txt user@server:/tmp/

如果加参数后连接成功,说明服务端的sftp子系统路径失效或权限不足,在服务器上执行ls -l /usr/libexec/openssh/sftp-server确认该文件存在且具有可执行权限。

scp上传文件时提示Permission denied (publickey),但用密码登录SSH没问题,怎么解决?

这个现象其实不是被踢,而是密钥认证权限顺序的问题,服务器端sshd_config中PubkeyAuthentication如果设为yes,而PasswordAuthentication也设为yes,客户端会优先尝试密钥认证,失败后不会自动回退到密码,导致直接断开,解决方法是服务端允许两种认证方式并存,或者在客户端明确指定:

scp -o PreferredAuthentications=password file.txt user@server:/tmp/

这一系列排查策略,基本能覆盖服务器文件传输过程中的绝大多数疑难杂症,SCP被踢的问题归根结底是连接建立阶段的稳定性问题,顺着SSH本身去排查路径最短,效率也最高,遇到此类需求时,把精力放在日志和配置的验证上,往往比反复重试命令更靠谱。

0