SFTP
SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。SFTP为SSH的一部分, SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作。SFTP传输提供了密码和密钥验证机制,可以有效防止传输过程的威胁和攻击。在 RHEL 9 中安全复制协议(SCP)存在已知的安全漏洞已被弃用,远程拷贝文件推荐使用SFTP安全文件传送协议。Windows 常用的SFTP客户端有XFTP、WinSCP、FileZilla等。
SFTP登录
密码登录
代码语言:javascript复制sftp -P 22 root@127.0.0.1
密钥登录
代码语言:javascript复制sftp -P 22 -i ~/.ssh/id_rsa root@127.0.0.1
SFTP Shell 基本操作
查看本地上传下载路径:lpwd
切换本地上传和下载的目录:lcd /opt
切换本地工作目录:lcd /opt
查看远程服务器当前目录:pwd
查看远程服务器目录下文件:ls
切换远程服务器工作目录:lcd /opt
SFTP下载文件
下载远程服务器文件到本地
代码语言:javascript复制get remote_file_name
下载文件重命名
代码语言:javascript复制get remote_file_name local_file_name
下载文件和目录
代码语言:javascript复制get -r directory_name
保持原来文件属性和日期
代码语言:javascript复制get -Pr directory_name
SFTP上传文件
上传本地文件到远程服务器
代码语言:javascript复制put localfile
上传文件和目录
代码语言:javascript复制put -r local_directory_name
SFTP命令参数介绍
代码语言:javascript复制sftp [hostname]:连接到指定的远程主机
df [-hi] [path]:显示当前目录或包含指定路径的文件系统的统计信息。
ls:列出远程主机上当前目录中的文件和文件夹
lls:列出本地主机上当前目录中的文件和文件夹
pwd:显示当前远程主机上的工作目录
lpwd:显示当前本地主机上的工作目录
cd [directory]:更改远程主机上的工作目录
lcd [directory]:更改本地主机上的工作目录
get [filename]:从远程主机下载指定的文件
put [filename]:上传本地计算机上的文件到远程主机
rm [filename]:删除远程主机上的指定文件
mkdir [directory]:在远程主机上创建一个新的目录
lmkdir [directory]:在本地主机上创建一个新的目录
rmdir [directory]:删除远程主机上的指定目录
rename [oldname] [newname]:将远程主机上的文件或目录重命名
chgrp [-h] grp path:将文件或目录的组(group)更改为指定的组
chmod [-h] mode path:将文件或目录的权限(permissions)更改为指定的权限模式。
chown [-h] own path:将文件或目录的所有者(owner)更改为指定的用户。
exit:退出SFTP会话
help:显示SFTP的帮助文本
限制SFTP用户其向上跨目录访问
SFTP是FTP over SSH的安全FTP协议,对于访问SFTP的用户建议使用专用账号,只能上传或下载文件,不能用于SSH登录,同时对SFTP可以访问的目录进行限定,防止目录遍历攻击。
创建sftp 用户、目录
新建用户组、用户和sftp目录
1.新建目录
代码语言:javascript复制mkdir -p /data/sftp/sftpuser
chown root:root /data/sftp/sftpuser
chmod 755 /data/sftp/sftpuser
2.新建用户组
代码语言:javascript复制groupadd sftp
3.新建用户
代码语言:javascript复制useradd -g sftp -d /data/sftp/sftpuser -M -s /sbin/nologin sftpuser
- -g指定用户组、-d指定家目录、-s nologin 不能登录系统、-M不创建家目录
设置sftp 用户密码
代码语言:javascript复制echo 'xxxxx'|passwd --stdin sftpuser
4.新建sftp可写目录
代码语言:javascript复制mkdir -p /data/sftp/sftpuser/upload
chown -R sftpuser:sftp /data/sftp/sftpuser/upload
chmod -R 755 /data/sftp/sftpuser/upload
ssh配置文件
1.注释如下参数
vim /etc/ssh/sshd_config
代码语言:javascript复制#Subsystem sftp /usr/libexec/openssh/sftp-server -l INFO -f AUTH
2.文件最后添加参数
vim /etc/ssh/sshd_config
代码语言:javascript复制Subsystem sftp internal-sftp -l INFO -f AUTH
Match Group sftp
ChrootDirectory /data/sftp/u%
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
参数介绍
- Subsystem sftp internal-sftp 表示sftp服务使用系统自带的internal-sftp,-l INFO 表示将日志级别设置为信息级别,-f AUTH 表示系统将记录与身份验证过程相关的日志
- Match Group sftp 表示配置指定的组,此处也可以写成Match User sftpuser来指定配置的用户
- ForceCommand internal-sftp 表示强制使用系统internal-sftp
- ChrootDirectory /data/sftp/%u 指定用户根目录,%u表示当前的用户
- AllowTcpForwarding no 禁止TCP转发
- X11Forwarding no 禁止X11转发
3.重启ssh服务
代码语言:javascript复制systemctl restart sshd
远程拷贝文件到本地
代码语言:javascript复制sftp username@remote_host:/path/to/remote_file local_file
- username:远程服务器用户名
- remote_host:远程服务器IP
- /path/to/remote_file:远程服务器文件路径
- local_file:要保存到本地的文件路径
拷贝本地文件到远端服务器
代码语言:javascript复制sftp username@remote_server:/path/to/remote_directory <<< "put /path/to/local_file"
- /path/to/remote_directory:远程服务器上保存文件的目录
- /path/to/local_file:要复制的本地文件的路径和文件名
- <<<:命令用于将字符串传输给sftp会话。命令字符串包括put用于将文件从本地复制到远程服务器
echo "put /opt/go1.19.linux-amd64.tar.gz" | sftp root@192.168.100.92:/mnt