sftp&&ssh服务配置一站式指南
SSH和SFTP服务对于运维人员来说必不可少,网上的教程不是太深就是太浅,我撰写该文章,旨在为广大入门运维的朋友提供一些干货
通常情况下,Windows作为SSH的客户端,Linux(如Ubuntu和CentOS)作为SSH的服务端,这很好理解,Linux广泛应用于企业服务器
用Ubuntu配置sftp&ssh服务
参考了这两篇教程:
SFTP服务器的搭建与使用_sftp服务器搭建-CSDN博客
Ubuntu 配置 SFTP 服务器_ubuntu sftp-CSDN博客
其中
- 教程1有java的代码实现
- 涉及一些权限修改内容
==root用户(不在意权限分发)可以直接用下面的步骤快速使用==
1.安装sftp服务
1 | sudo apt update |
sftp是openssh里面的一个子协议
2.编辑配置文件/etc/ssh/sshd_config
如果没有UI界面,可以使用vim编辑器
这里要注意是sshd而不是ssh,前者对应的是服务端后者是客户端
2.1 将如下这行用#
符号注释掉
(为什么要注释掉可以看这篇文章【OpenSSH】internal-sftp和sftp-server之间的区别和联系什么? - 简书 (jianshu.com))
1 | # Subsystem sftp /usr/libexec/openssh/sftp-server |
2.2 在文件最后面添加如下几行内容然后保存(最好放在文件末尾)
1 | Subsystem sftp internal-sftp |
大模型Copilot对此的解释如下:
- Subsystem sftp internal-sftp
- 这行定义了一个 SFTP 子系统,使用
internal-sftp
作为 SFTP 服务器。
- 这行定义了一个 SFTP 子系统,使用
- Match Group sftp
- 这行表示接下来的配置只适用于属于
sftp
组的用户。
- 这行表示接下来的配置只适用于属于
- ChrootDirectory /sftp/%u
- 这行将用户的根目录(chroot)设置为
/sftp/%u
,其中%u
会被替换为用户的用户名。这意味着用户只能访问他们自己的目录,增强了安全性。
- 这行将用户的根目录(chroot)设置为
- ForceCommand internal-sftp
- 这行强制用户只能使用
internal-sftp
命令,限制他们只能进行 SFTP 操作,不能执行其他命令。
- 这行强制用户只能使用
- AllowTcpForwarding no
- 这行禁用了 TCP 转发,进一步限制了用户的操作权限,防止他们通过 SSH 隧道进行端口转发。
- X11Forwarding no
- 这行禁用了 X11 转发,防止用户通过 SSH 隧道转发 X11 图形界面
- PermitRootLogin yes
- 允许用户通过root登录。在终端里使用命令
echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
能达到同样效果(需要service ssh restart)
- 允许用户通过root登录。在终端里使用命令
如遇到只读文件不可编辑的情况,可使用以下命令赋权
1 | sudo chmod a+w 文件名 |
3.修改ssh所用端口号(可选)
由于ipv4地址稀缺之类的原因,大概率vps提供商或者你自己用了NAT技术,那么也许sftp的默认22端口就无法使用
这时候你需要修改sftp的默认端口号为目前可用的端口(比如我的vps提供商给我开了十个端口,你自己的NAS也可以在你家路由器里添加端口映射)
在sshd_config文件里,将
1 | # port 22 |
改为
1 | port <可用的端口,不含括号> |
完成后别忘了保存
改完之后,貌似ssh远控的端口也会随之修改了
4. 重启sshd服务
1 | service ssh restart |
这边可能遇到如下图一样的报错Failed to restart sshd.service: Unit sshd.service not found.
此时就需要进一步排查了,
先测试能不能ping通主机
检查sshd的安装情况
1
ps -e | grep ssh
成功安装会如下图所示
测试端口是否开启(ssh服务默认用22端口)
1
ss -ntl
ss
类似于netstat
命令,直接使用貌似会列出所有进程端口。-n
选项表示以数字形式显示地址和端口,而不是尝试将其解析为主机名和服务名。-t
选项表示仅显示 TCP 套接字。-l
选项表示仅显示监听套接字。
也许你的终端会提示bash: ss: command not found
,ss命令依赖于iproute2,那么我们就先安装即可,命令如下
1 | apt install -y iproute2 |
完成后再使用刚才的命令。我这里就是只显示了表头,下面并没有任何信息(尤其是与sshd有关端口的)
看来是sshd服务并未启动,那就使其重启,命令如下
1 | systemctl enable ssh.service |
查了一下资料,systemd是Linux的一种服务管理器,这让我想起了Windows里也有类似的GUI工具
命令进行后,竟然提示我permission denied
,吓得我赶紧用sudo -i
提权了一下,再次用一遍命令即可,此时service sshd restart
已经可用。
再用一遍进程显示的命令,可以看到22端口已经乖乖运行
5.验证服务
1 | sftp -P 11165 root@127.0.0.1 |
中间的11165是前面设置的可用的端口号
服务正常的话,日志应该如下
1 | root@hbcm-7k62-nat1-202409041216467fca88:~# sftp -P 11165 mysftp@127.0.0.1 |
会要求你输密码,输入后就能进入sftp命令层了
如果登录失败,可能是遭遇了一个权限问题,在上文提到的sshd.config的设置项里,有一个参数PermitRootLogin
限定root用户通过ssh的登录方式,如禁止登陆、禁止密码登录、仅允许密钥登陆和开放登陆。需要设置成yes获取所有权限:
1 | PermitRootLogin yes |
更多细节可以参考这篇文章:
sshd_config 中 PermitRootLogin 的探讨-CSDN博客
不过我这里默认的是Fobidden开头的,文章里并未提到,但是有了这个思路以后自己搜一下也很方便了。
6.windows为例使用sftp进行测试
为了让事情变得更简单,还要批量传文件,我选择用一个sftp客户端,例如WinSCP,会要求输入主机(即为公网ip)和端口号(默认为22,你需要修改为前面你设置的),用户名和密码就是Linux的登入账户信息
理论上,sftp可以挂载到资源管理器(Exploer)里使用,这就变成了一个文件夹一样交互。但是看来看去,因为Windows本身没有sftp的内部支持,还要做协议接口转换,太复杂。实在想搞网络存储挂载的话,可以使用WebDAV协议,而不是SFTP。
将SMB用作局域网传输,WebDAV或者SMB+VPN作为广域网传输,永远是网络存储最好的方案。
其他实现文件传输的方式
WinSCP其实支持多种文件传输协议,各种协议的区别可见这里
SFTP,SMB,FTP,SCP选哪种?
用Windows配置sftp&ssh服务
作为客户端,有诸多客户端程序可选:
PowerShell
直接用原生的终端进行一些简单的操作未尝不可PuTTY
很质朴的应用,提供一个简洁的界面供你输入地址和端口号,但也仅此而已一些第三方做的SSH工具,集成了sftp服务,还能保存一些自定义命令将来快捷使用,同时也有好看的GUI界面 ,比如Termius
作为服务端,你可以参考以下实践:
- 启用 OpenSSH 服务器:
- 打开“控制面板” > “程序” > “程序和功能” > “启用或关闭 Windows 功能”。
- 在“Windows 功能”窗口中,找到并勾选“OpenSSH 服务器”。
- 点击“确定”安装 OpenSSH 服务器。
- 配置 OpenSSH 服务器:
- 安装完成后,您可以通过搜索并打开“服务”应用来配置 OpenSSH 服务器。
- 找到“OpenSSH SSH Server”服务,右键点击选择“属性”。
- 在“登录”选项卡中,确保选择了“本地系统账户”,并勾选“允许服务与桌面交互”(如果需要图形界面登录)。
- 在“恢复”选项卡中,设置失败时的恢复操作。
- 启动服务。
- 设置防火墙规则(如果需要):
- 打开“Windows 防火墙”设置。
- 允许入站连接到 SSH 服务的端口(默认是 22)。
- 生成 SSH 密钥对(如果需要无密码登录):
- 在 Windows PowerShell 中,您可以使用
New-SSHKey
命令生成新的 SSH 密钥对。 - 将生成的公钥复制到客户端的
~/.ssh/id_rsa.pub
文件中。
- 在 Windows PowerShell 中,您可以使用
- 连接到 Windows SSH 服务器:
- 使用 SSH 客户端(如 PuTTY 或 Windows 10 及更高版本的 Windows Subsystem for Linux (WSL) 中的 SSH 客户端)连接到 Windows 主机。
- 使用格式如下的命令:
ssh username@hostname -p port
,其中username
是 Windows 用户名,hostname
是 Windows 主机的 IP 地址,port
是 SSH 服务监听的端口(默认是 22)。
- 标题: sftp&&ssh服务配置一站式指南
- 作者: 三葉Leaves
- 创建于 : 2024-09-04 00:00:00
- 更新于 : 2024-11-21 16:56:20
- 链接: https://leavesblog.netlify.app/6128f81adc0c/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。