SFTP 上传、下载文件

2023-12-19 16:12:43 浏览数 (2)

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用于将文件从本地复制到远程服务器
代码语言:javascript复制
echo "put /opt/go1.19.linux-amd64.tar.gz" | sftp root@192.168.100.92:/mnt

0 人点赞