安全文件传输协议(Secret File Transfer Protocol,SFTP),也被称为SSH File Transfer Protocol ,是一种基于安全外壳协议(Secure Shell,SSH)的文件传输协议,常用于计算机之间的文件数据传输。

SFTP只需用到一个端口(通常是22号端口),且大部分Linux系统都支持SFTP协议,这意味着SFTP有着较好的兼容性。

本教程结合作者实际的操作经历,将常用的SFTP配置、连接及挂载教程进行了汇总,并对一些不常见的配置细节进行了补充。希望本教程能帮助到有需要的人少走弯路。

服务器配置SFTP

服务器只有正确配置了SFTP才能提供文件传输服务。本教程将对Linux系统的SFTP配置进行介绍。

安装SSH服务

服务器需要安装SSH服务才能启动SFTP功能。部分Linux系统(比如CentOS)默认安装了SSH。若没有安装SSH,Linux系统通常可以使用包管理器来进行安装,以Debian衍生系统(比如Ubuntu)为例,其可通过如下指令安装SSH:

sudo apt install openssh-server

安装了SSH后,部分Linux系统(比如CentOS)可以通过如下指令查询SSH服务状态:

systemctl status sshd

而Ubuntu这类Linux系统则用如下指令:

systemctl status ssh

不同Linux系统安装SSH的指令可能各有不同,用户需根据系统的具体情况进行安装。

创建SFTP账户

这一步用于创建一个只用于SFTP文件传输的SSH账户。能够进行SSH登录的账户通常都可用于SFTP文件传输,但这么做可能导致隐私文件泄露,因此,服务器通常使用具有访问限制的账户进行SFTP文件传输。

在创建该SSH账户前需要先创建或指定一个用于SFTP服务的共享文件夹,也被称为共享目录,本文以创建共享目录“/home/sftp/”为例(井号“#”及后续内容为注释,输入指令时不要包含):

mkdir /home/sftp            # 新建文件夹
chown root:root /home/sftp  # 修改所属用户
chmod 755 /home/sftp        # 修改权限

上述指令可能需要加上”sudo“提权。

为便于服务器账户浏览SFTP共享文件,可以创建一个专门的用户组,本文以“sftpGroup”组名为例:

groupadd sftpGroup

需要访问SFTP共享文件的账户使用如下指令加入该“sftpGroup”组:

usermod -a -G sftpGroup 服务器账户

接着创建SFTP账户,文本以“test”账户名为例:

useradd -d /home/sftp/test -s /bin/false -g sftpGroup test

上述指令的“-s /bin/false”用于限制该账户的功能,使其仅用于SFTP服务;“-g”指定“sftpGroup”为“test”账户的组;“-d”指定“/home/sftp/test”文件夹为“test”的用户目录(即“~”),该文件夹需要在之前指定的SFTP文件夹内,若该文件夹没有自动创建,则需要手动创建:

mkdir /home/sftp/test
chown test:sftpGrooup /home/sftp/test

随后修改用户目录的权限使得加入了“sftpGroup”组的服务器账户可以访问共享文件:

chmod 755 /home/sftp/test

最后再修改该账户的登录密码

passwd test

修改SSH配置文件

这一步需要对“/etc/ssh/sshd_config”配置文件进行编辑以使得之前创建的SSH账户可用于SFTP服务。使用vim编辑的指令为:

vim /etc/ssh/sshd_config

使用gedit编辑的指令为:

gedit /etc/ssh/sshd_config

在“/etc/ssh/sshd_config”中找到:

Subsystem  sftp  /usr/libexec/openssh/sftp-server

将其注释:

#Subsystem  sftp  /usr/libexec/openssh/sftp-server

随后在末尾补充如下内容:

Subsystem sftp internal-sftp
Match User test
  ChrootDirectory /home/sftp
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp

上述内容的“Match User”用于对指定账户“test”进行配置;“ChrootDirectory”用于限定账户“test”向上只可访问至共享文件夹“/home/sftp”,而不可访问该目录之外的其它文件;“ForceCommand internal-sftp”用于限定账户“test”只用于SFTP服务。其它与SFTP无关的服务也可以关闭。

如果还需要修改端口及控制登录的客户机IP,则需要在“/etc/ssh/sshd_config”中的“Match User”之前填加如下内容:

Port 端口号
AllowUsers test@IP地址

修改完配置文件后需要重启SSH服务,部分Linux系统(比如CentOS)可用如下指令:

systemctl restart sshd

或:

service sshd restart

Debian衍生系统(比如Ubuntu)则用:

sudo /etc/init.d/ssh restart

或:

sudo systemctl restart ssh

或:

sudo service ssh restart

客户机连接SFTP

在确保SFTP服务端的IP是可以访问的前提下,安装了SSH客户端的客户机就可以通过SFTP与服务端传输文件了。

Linux服务端的IP可以通过如下指令查询IP:

ifconfig

直接连接

客户端就可以使用如下指令连接至SFTP服务端:

sftp 账户名@IP地址

连接到服务器后再输入密码就可以进行传输操作。

SFTP常用指令

SFTP通常使用如下指令进行传输等操作:

指令名功能使用示范
put向服务端上传文件put 文件名
put -r 文件夹 远程目录
get从服务端下载文件get 文件名
get -r 文件夹 远程目录
rm删除服务端文件rm 文件名
rmdir删除服务端文件夹rmdir 文件夹
ls显示服务端当前目录内容ls
cd进入服务端指定目录cd 文件夹
! 命令在客户端执行指定命令! pwd

免密连接

免密连接指自动使用密钥对而不是手动输入密码进行连接。SSH通常使用RSA密钥来进行连接,大部分Linux系统可以使用如下指令创建RSA密钥对:

ssh-keygen -t rsa -b 2048

上述指令的“-t rsa”用于指定生成RSA密钥;“-b”用于设置RSA密钥的位数,该数值越大则RSA越复杂。

上述指令执行后通常会在用户目录的“.ssh”这一隐藏文件夹(即“~/.ssh”)中生成服务器用的“id_rsa.pub”公钥和客户机连接用的“id_rsa”私钥。

通常情况下,在使用默认配置时,Linux服务器端只需将“id_rsa.pub”公钥重命名为“authorized_keys”并放置于SFTP账户的用户目录的“.ssh”文件夹(在本教程所用的“test”例子中为“/home/sftp/test”目录)中,同时在Linux客户机中将“id_rsa”私钥放置于用于连接的账户的用户目录的“.ssh”文件夹中,并确保该私钥的权限被设为仅可被连接用的账户访问:

chown 客户机账户:客户机账户 id_rsa
chmod 600 id_rsa

就可完成密钥对的部署。随后再使用SFTP连接指令就可以不用输密码了:

sftp 账户名@IP地址

修改公钥名和位置

Linux服务器和Linux客户机的默认公私钥的名字和位置都是可以修改的。对于Linux服务器来说,编辑SSH配置文件“/etc/ssh/sshd_config”,输入如下内容即可修改公钥名和位置:

PubkeyAuthentication yes
RSAAuthentication yes
AuthorizedKeysFile 目录/公钥名字

对于本教程所用的“test”例子,则可结合“Match User”指令将内容修改为:

Subsystem sftp internal-sftp
Match User test
  ChrootDirectory /home/sftp
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
  PubkeyAuthentication yes
  RSAAuthentication yes
  AuthorizedKeysFile 目录/公钥名字

修改私钥名和位置

对于Linux客户机来说,在确保私钥权限正确的前提下,编辑用于连接的账户的用户目录的“.ssh/config”文件,输入如下内容即可修改私钥名和位置:

Host 简称
  HostName IP地址
  User 账户名
  Port 22
  IdentityFile 目录/私钥名字

如果打算只用密钥而不使用密码登录则可再上述内容后补充:

IdentitiesOnly  yes

客户机配置完后就可以使用简称来进行SFTP连接:

sftp 简称

若需要连接到多个服务器的SFTP或SSH,则可以编写多个“Host”:

Host 简称1
  HostName IP地址1
  User 账户名A
Host 简称2
  HostName IP地址2
  User 账户名B

客户机挂载SFTP

除了直接连接SFTP外,大部分操作系统还可以通过将SFTP挂载为网络文件夹的方式来进行更为灵活方便的文件数据传输。

为确保挂载的稳定性,建议在“/etc/ssh/sshd_config”中追加如下内容:

ClientAliveInterval 60
ClientAliveCountMax 3

上述内容规定服务端每60秒发一次心跳,失败后重连次数最多3次,这些数字用户可根据具体需求调整。

Linux挂载SFTP

部分Linux客户机可以借助“sshfs”这类工具软件来进行SFTP挂载。CentOS这类系统使用如下指令安装sshfs:

dnf config-manager --set-enabled powertools
dnf install fuse-sshfs

老版本的CentOS执行上述指令时可能需要换源以及用“yum”指令代替“dnf”,有时还可能要手动填加fuse用户组:

usermod -a -G fuse 账户名

而对于ubuntu这类系统则使用如下指令安装sshfs:

apt-get install sshfs

如果需要其他账户也能访问挂载目录,则还需要编辑“/etc/fuse.conf”,向其添加如下内容:

user_allow_other

直接挂载

安装了sshfs后使用如下指令即可将服务端的SFTP目录挂载为客户机本地目录:

sshfs 账户名@IP地址:/目录 挂载目录 -o sshfs_sync,allow_other

上述指令的“-o”用于指定SFTP的附加功能,本例中的“sshfs_sync”用于数据修改后的立即同步;“allow_other”允许客户机的其他用户访问SFTP共享目录。sshfs的“-o”还可以支持“ServerAliveInterval=60”、“ServerAliveCountMax=3”等参数,用户可根据具体需求进行设置。

如果客户机配置了“~/.ssh/config”的Host,则还可以使用“Host”的简称来进行SFTP挂载:

sshfs 简称:/目录 挂载目录 -o sshfs_sync,allow_other

卸载共享目录

若要卸载已连接的SFTP目录,可以使用umount指令,在使用该指令前可以先使用df指令查询挂载情况:

df

随后再用umount卸载SFTP目录:

umount 挂载目录

启动时自动挂载

设置启动时自动挂载需要先设置免密连接

随后再修改“/etc/fstab”,向其末尾追加如下内容:

账户名@IP地址:/目录 挂载目录 fuse.sshfs defaults,allow_other,_netdev 0 0

上述指令在“defaults”之后同样可以自定义连接参数,若设置了root账户的“/root/.ssh/config”的Host,则可以使用“Host”的简称来进行挂载:

简称:/目录 挂载目录 fuse.sshfs defaults,allow_other,_netdev 0 0

以本教程用的“test”为例,设其用户目录为“/home/sftp/test”,设其在服务端的“/etc/ssh/sshd_config”的内容被配置为:

Port 22
Subsystem sftp internal-sftp
Match User test
  ChrootDirectory /home/sftp
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
  PubkeyAuthentication yes
  RSAAuthentication yes
  AuthorizedKeysFile 目录/公钥名字
  ClientAliveInterval 60
  ClientAliveCountMax 3

则客户机的“/root/.ssh/config”的内容可设置为:

Host hgsftp
  HostName IP地址
  User test
  Port 22
  IdentityFile 目录/私钥名字

而客户机的“/etc/fstab”则需在末尾追加如下内容:

hgsftp:/test 挂载目录 fuse.sshfs defaults,allow_other,_netdev 0 0

Window挂载SFTP

Windows客户机需要安装第三方软件才能挂载SFTP,本教程以Win10中安装WinFSP为例。

可以从WinFSP官网下载到连接SFTP所需的“sshfs-win”和“winfsp”安装程序。

pic01

将这2个程序安装上后,右键点击“此电脑”,选择“映射网络驱动器”。

pic02

在“映射网络驱动器”界面中选择盘符,按需要选择其它功能,随后在“文件夹”处输入连接指令:

\\sshfs.r\账户名@IP地址\目录

以本教程用的“test”为例,“映射网络驱动器”界面的“文件夹”处的内容如下图所示。

pic03

连接成功后就可以在电脑中见到对应的SFTP网盘了。

pic04

参考网址

  1. linux下禁止某一用户使用ssh登陆但可使用sftp登陆
  2. linux下使用sshfs挂载远程linux文件系统或目录
  3. Centos sshfs的安装和使用–将远程sftp目录映射到本地目录
  4. SSH 密钥登录
  5. 使用 SSHFS 挂载远程的 Linux 文件系统及目录
  6. 在 centOS 上设置 SSH 用户配置(本地客户端)
  7. 解决SSH自动断线问题
  8. sftp的操作命令
  9. ubuntu 20.04 通过 sshfs 共享文件夹到 windows
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐