轻松部署SFTP并解决连接未设置密钥的报错

简介: 尊敬的读者们,大家好!SFTP是一种基于SSH的加密文件传输协议,可确保您的数据在传输过程中得到保护,是一种可信赖的文件传输解决方案。在实际生产环境中,连接第三方SFTP服务器是许多企业进行文件传输的常见需求。然而,有时候当第三方SFTP服务器切换节点后,我们的服务连接却会出现失败的情况。我们今天就遇到了这种情况,第三方服务因国产化需求切换到了新的节点,导致我们的服务连接sftp服务器失败。在本文中,我将与您分享这个问题的原因以及解决方法以及如何使用Docker Compose快速部署SFTP(Secure File Transfer Protocol)服务,帮助您轻松应对类似的挑战。

sftp.jpg

尊敬的读者们,大家好!SFTP是一种基于SSH的加密文件传输协议,可确保您的数据在传输过程中得到保护,是一种可信赖的文件传输解决方案。在实际生产环境中,连接第三方SFTP服务器是许多企业进行文件传输的常见需求。然而,有时候当第三方SFTP服务器切换节点后,我们的服务连接却会出现失败的情况。我们今天就遇到了这种情况,第三方服务因国产化需求切换到了新的节点,导致我们的服务连接sftp服务器失败。在本文中,我将与您分享这个问题的原因以及解决方法以及如何使用Docker Compose快速部署SFTP(Secure File Transfer Protocol)服务,帮助您轻松应对类似的挑战。

问题现象

首先,让我们来了解一下这个问题的现象。当第三方SFTP服务器切换到新的节点后,您的服务尝试连接该服务器可能会遇到连接失败的情况。这种问题通常表现为无法建立SFTP连接,错误信息可能包括"Connection refused"、"Host key verification failed"或"Permission denied"等。我们的报错信息如下:

2023-07-19 10:30:52,166 [queueListenerContainer-13] ERROR [cn.xj.common.ftp.FtpUtils] - 链接FTP异常 connection is closed by foreign host
com.jcraft.jsch.JSchException: connection is closed by foreign host
        at com.jcraft.jsch.Session.connect(Session.java:269)
        at com.jcraft.jsch.Session.connect(Session.java:183)
        at cn.leadeon.common.ftp.FtpUtils.getConnect(FtpUtils.java:64)
        at cn.leadeon.activemq.MessageReceiverListener.downJsonFile(MessageReceiverListener.java:152)
        at cn.leadeon.activemq.MessageReceiverListener.onMessage(MessageReceiverListener.java:128)
        at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:744)
        at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:682)
        at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:649)
        at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:317)
        at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:255)
        at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1167)
        at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1159)
        at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1056)
        at java.lang.Thread.run(Thread.java:745)

问题原因

SFTP连接失败的主要原因是与新节点相关的SSH密钥变化。每个SFTP服务器都有其独特的SSH密钥对(公钥和私钥),用于加密通信和身份验证。当SFTP服务器切换到新的节点时,其密钥对可能会发生变化,导致我们之前保存的旧密钥无法通过新节点进行验证,从而引起连接失败。

解决方法

我们手动在服务器是上连接第三方sftp,并重新生成秘钥

_20230719233551.png

sftp服务部署(docker-compose)

确保我们的服务器已经安装了docker及docker-compose。

在您选择的目录下创建一个新文件,并将其命名为 docker-compose.yml。在该文件中,我们将定义 sftp 服务的配置。

docker-compose.yml

version: '3.3'
services:
  sftp-server:
    image: atmoz/sftp:latest
    container_name: sftp-server
    restart: always
    ports:
      # 将主机的端口2222映射到容器的端口22(SFTP默认端口)
      - "2222:22"
    volumes:
      - ./data:/home
    command: admin:admin:1100

启动服务

dockerr-compose up -d

终端连接sftp,首次连接需要生成生成密钥

sftp -P2222 admin@192.168.10.106

_20230719235006.png

上传文件

put /home/xiuji/a.png

若出现权限问题,则修改挂载用户目录的权限
_20230719235220.png

sudo chmod -R 777 admin

创建文件夹、上传、下载文件

mkdir test

cd test

put /home/xiuji/a.png

get a.png

_20230719235659.png

结语

通过使用Docker Compose快速部署SFTP服务,我们成功创建了一个安全、高效的文件传输环境。SFTP不仅保护了您的数据安全,而且在搭建和管理过程中也非常便捷。希望本文对您在实现安全文件传输方面有所帮助。

目录
相关文章
远程服务器返回错误(530)未登录 C# Ftp
    C#试图登录Ftp服务器时,报错“远程服务器返回错误(530)未登录”。     这是一个什么原因引起的呢? private void ConnectFTP() {         this.
7234 0
|
Linux
Xshell 登录 AWS CentOS 出现“所选择的用户秘钥未在远程主机上注册“,最终解决办法!
其实就是 登录用户名错了,是 root,不是centos 也不是 ec2-user !  Xshell 连接配置界面如下   最重要是 登录授权配置  最后,登录成功! 就这么简单
2852 0
|
5月前
|
安全 Linux Shell
SSH服务器拒绝密码登录的解决方法
SSH服务器拒绝密码登录的解决方法
1296 1
|
存储 网络安全 数据安全/隐私保护
scp上传文件到远程服务器,如何避免每次都要输入远程服务器的密码
scp上传文件到远程服务器,如何避免每次都要输入远程服务器的密码
390 0
|
存储 关系型数据库 MySQL
常见连接工具保存密码获取
之前有发过关于xshell&finalshell密码破解的文章,本文将继续对一些其他常见的连接工具进行讨论,如有错误,欢迎留言指出!
533 0
常见连接工具保存密码获取
|
Linux 网络安全
【Linux网络服务】SSH密钥的批量分发
【Linux网络服务】SSH密钥的批量分发
|
网络安全 数据安全/隐私保护
ssh操作及接受响应,自动获取test密码
ssh操作及接受响应,自动获取test密码
108 0
|
网络安全 数据安全/隐私保护 Windows
原来Win10是自带SSH软件的,包含客户端和服务端
原来Win10是自带SSH软件的,包含客户端和服务端
1399 0
原来Win10是自带SSH软件的,包含客户端和服务端
|
网络安全 网络协议 开发工具
修改ssh远程默认端口
1. 修改ssh配置文件 [root@distzabbix ~]# vim /etc/ssh/sshd_config 找到第17行附近#Port 22 将#注释去掉,再新加一行Port 4522 15 # semanage port -a -t ssh_port_t -p tcp #PORTNU.
1957 0
|
关系型数据库 数据安全/隐私保护 Windows
解决办法:本机远程连接服务器时出现身份验证错误,要求函数不受支持!
在用户名、IP、密码都对的情况下别的电脑能连接上,只有自己的电脑连接不上说函数不受支持 具体解决办法 windows专业版以上: 打开组策略编辑器 选择:计算机配置——管理模板——系统——凭据分配 双击“加密Orac...
2184 0