linux网络服务搭建sftp指南
定义
SFTP(SSH File Transfer Protocol)即 SSH 文件传输协议。
它是一种安全的文件传输协议,运行在 SSH(Secure Shell)协议之上,利用 SSH 通道来提供安全的文件传输服务。安全特性
加密传输
SFTP 对传输的数据进行加密,包括文件名、文件内容、目录结构等所有信息。这可以防止数据在网络传输过程中被窃取或篡改。
例如,当在两个网络节点之间传输敏感的商业文件或者用户隐私数据时,加密机制能确保数据安全。
基于 SSH 认证:它依赖 SSH 的认证机制,如使用公钥 - 私钥对或者用户名 / 密码组合进行身份验证。这意味着只有通过认证的用户才能建立 SFTP 连接并进行文件传输。
例如,系统管理员可以通过配置 SSH 公钥认证,为特定用户提供更安全的访问方式来传输文件。
工作原理
SFTP 客户端与服务器建立 SSH 连接后,通过该连接进行文件传输操作。SSH 协议负责提供安全的通信通道,包括对传输的数据进行加密和完整性检查。
在这个通道基础上,SFTP 协议规定了文件传输相关的操作,如文件的上传(put 操作)、下载(get 操作)、目录浏览、文件删除、重命名等操作。
从技术层面讲,当客户端发起一个 SFTP 请求时,SSH 服务器会创建一个子进程来处理这个请求,这个子进程专门负责与客户端进行 SFTP 通信,并且严格遵循 SFTP 协议来处理文件传输事务。
与 FTP 的对比
安全性:
FTP(File Transfer Protocol)是传统的文件传输协议,它以明文形式传输数据,包括用户名、密码和文件内容等。这使得 FTP 在不安全的网络环境中很容易被中间人攻击,导致信息泄露。而 SFTP 通过加密解决了这个安全隐患。
例如,在一个公共无线网络环境中,如果使用 FTP 传输银行账户信息相关的文件,黑客很容易截获这些数据;但如果使用 SFTP,数据会被加密,黑客截获的数据将是无法解读的密文。
连接方式:
FTP 使用两个独立的连接,一个用于传输控制信息(如命令),另一个用于传输数据。这种方式在防火墙环境下可能会遇到问题,因为防火墙可能会阻止其中一个连接。
SFTP 只使用一个 SSH 连接来传输控制信息和数据,更容易通过防火墙,减少了因防火墙设置导致的连接问题。
应用场景
企业内部文件共享和传输:企业内部网络中,不同部门之间需要安全地共享文件,如财务数据、设计文档等。SFTP 提供了一个安全可靠的方式,确保数据在传输过程中的保密性和完整性。
服务器管理和维护:系统管理员可以使用 SFTP 从远程服务器下载日志文件进行故障诊断,或者上传配置文件来更新服务器设置。例如,当管理一个大型的数据中心,管理员可以通过 SFTP 安全地在本地和服务器之间传输系统更新文件。
配置sftp需要的环境
//创建一个sftp的一个认证用户并且设置密码
useradd sftp -s /sbin/nologin passwd sftp
//修改它的主目录的拥有者和拥有组并赋予权限
chown root:sftp /home/sftp chmod 755 /home/sftp
//创建一个测试用的目录里面有几个文件
mkdir /home/sftp/upload #在主目录创建一个目录方便搭建完用于测试,这是我upload下的文件 boot.xfsdump boot_1.xfsdump command.txt config.file english.txt note.shell rsyncd.conf.bak text.edit
//修改一下sftp的配置文件
vim /etc/ssh/sshd_conf #我这里是centos7
在配置之前需要把这个#Subsystem sftp /usr/libexec/openssh/sftp-server给注释掉,在前面加一个"#"即可
#把这些配置加到#Subsystem sftp /usr/libexec/openssh/sftp-server改行下面或者文件末尾都可以
#强制执行内部sftp Subsystem sftp internal-sftp #限定只有sftp组的才能访问 Match Group sftp #是否允许进行 X11 转发 X11Forwarding no #是否允许TCP转发 AllowTcpForwarding no #设定属于用户组sftp的用户访问的根目录 ChrootDirectory %h #强制执行这里指定的命令而忽略客户端提供的任何命令 ForceCommand internal-sftp
Match Group sftp这一行是指定以下的子行配置是匹配 sftp 用户组的。Match user userA,userB 则是匹配用户。ChrootDirectory /data/sftp/%u设定属于用户组 sftp 的用户访问的根文件夹。%h 代表用户 home 目录,%u 代表用户名。ForceCommand internal-sftp该行强制执行内部 sftp,并忽略任何 ~/.ssh/rc 文件中的命令。AllowTcpForwarding no是否允许 TCP 转发,默认值为 "yes", 禁止 TCP 转发并不能增强安全性,除非禁止了用户对 shell 的访问,因为用户可以安装他们自己的转发器。X11Forwarding no是否允许进行 X11 转发。默认值是 "no",设为 "yes" 表示允许。如果允许 X11 转发并且 sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。那么将可能有额外的信息被泄漏。由于使用 X11 转发的可能带来的风险,此指令默认值为"no"。需要注意的是,禁止 X11 转发并不能禁止用户转发 X11 通信,因为用户可以安装他们自己的转发器。
//接下来把sshd启动起来即可
systemctl start sshd
连接远程服务器
//远程连接然后输入你刚才为用户设置的密码即可

基本语法:sftp [用户@]服务器地址。例如,要以用户user1的身份连接到服务器192.168.1.100,可以使用命令sftp user1@192.168.1.100。如果服务器允许使用 SSH 密钥认证,并且已经配置好本地密钥,可能不需要输入密码就能直接连接。如果使用密码认证,会提示输入密码。
端口指定:如果远程服务器的 SFTP 服务不是使用默认的 SSH 端口(默认是 22),可以使用-P选项指定端口。例如,服务器使用端口 2222 提供 SFTP 服务,连接命令可以是sftp -P 2222 user2@192.168.1.200。
sftp> ls upload sftp> cd upload sftp> ls boot.xfsdump boot_1.xfsdump command.txt config.file english.txt note.shell rsyncd.conf.bak text.edit sftp> get note.shell /root/ Fetching /upload/note.shell to /root/note.shell note.shell 100% 987 274.1KB/s 00:00 sftp> lls /root 公共 模板 视频 图片 文档 下载 音乐 桌面 my.sql note.shell passwd rsync.passwd sftp> get config.file /root/ Fetching /upload/config.file to /root/config.file config.file 100% 210 48.8KB/s 00:00 sftp> lls /root 公共 模板 视频 图片 文档 下载 音乐 桌面 config.file my.sql note.shell passwd rsync.passwd sftp> put my.sql /upload/ Uploading my.sql to /upload/my.sql my.sql 100% 1880 909.5KB/s 00:00 sftp> ls boot.xfsdump boot_1.xfsdump command.txt config.file english.txt my.sql note.shell rsyncd.conf.bak text.edit sftp> rm my.sql Removing /upload/my.sql sftp> ls boot.xfsdump boot_1.xfsdump command.txt config.file english.txt note.shell rsyncd.conf.bak text.edit sftp>
基本文件传输操作
下载文件:
语法:get [远程文件路径] [本地文件路径]。
例如,要从远程服务器的/home/user3/data.txt下载文件到本地当前目录,可以使用命令get /home/user3/data.txt。
如果想把文件下载到本地的指定目录,如/local/downloads,可以使用get /home/user3/data.txt /local/downloads/data.txt。
上传文件:
语法:put [本地文件路径] [远程文件路径]。
例如,要将本地的/local/files/script.sh上传到远程服务器的/home/user4/scripts目录下,可以使用命令put /local/files/script.sh /home/user4/scripts/script.sh。
目录操作
列出远程目录内容:
- 命令:ls。这和在本地使用ls命令类似,用于查看远程服务器当前目录下的文件和目录。
- 例如,在连接到远程服务器后,输入ls,会显示当前远程目录下的文件名和目录名列表。如果想查看远程指定目录的内容,比如查看/home/user5/documents目录下的内容,可以使用ls /home/user5/documents。
切换远程目录:
- 命令:cd。用于在远程服务器的目录之间进行切换。
- 例如,要从当前远程目录切换到/home/user6/backups目录,可以使用命令cd /home/user6/backups。
创建远程目录:
- 命令:mkdir。用于在远程服务器上创建新的目录。
- 例如,要在远程服务器的/home/user7目录下创建一个名为new_folder的新目录,可以使用命令mkdir /home/user7/new_folder。
- 其他操作
查看当前远程目录位置:
- 命令:pwd。这会显示当前在远程服务器上所处的目录路径。
- 例如,在连接到远程服务器后,经过一系列的目录切换操作,使用pwd命令可以明确当前所在的目录位置。
删除远程文件或目录:
- 命令:rm用于删除远程文件,rmdir用于删除远程目录(前提是目录为空)。
- 例如,要删除远程服务器/home/user8/temp目录下的文件temp_file.txt,可以使用rm /home/user8/temp/temp_file.txt。要删除远程的空目录/home/user9/empty_folder,可以使用rmdir /home/user9/empty_folder。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。


最新评论