手把手教你使用 SFTP 安全地传输文件
nanshan 2025-04-24 05:59 11 浏览 0 评论
什么是 SFTP ?
在了解 SFTP 之前,我们先看看什么是 FTP 。FTP( File Transfer Protocol )文件传输协议,是一种常用来在两终端系统之间传输文件的方法。
SFTP ,即 SSH 文件传输协议( SSH File Transfer Protocol ),或者说是安全文件传输协议( Secure File Transfer Protocol )。SFTP 是一个独立的 SSH 封装协议包,通过安全连接以相似的方式工作。它的优势在于可以利用安全的连接传输文件,还能遍历本地和远程系统上的文件系统。
在大多数情况下,优先选择 SFTP 而不是 FTP ,原因在于 SFTP 最基本的安全特性和能利用 SSH 连接的能力。FTP 是一种不安全的协议,应当只有在特定的情况下或者你信任的网络中使用。
虽然 SFTP 集成了很多图形工具,但是这一篇使用指南会演示如何使用交互式命令行界面来使用它。以下就是使用指南。
如何使用 SFTP 连接
在默认情况下, SFTP 使用 SSH 协议进行身份验证并建立安全连接。正因如此,相同的存在于 SSH 中的验证方法是可用的。
尽管通过默认的方式,使用和设置密码很方便,我们还是强烈建议你建一个 SSH 密钥,把你的公钥传给你需要访问的所有系统。长远来看,这样会更加安全,也节省你的时间。
如果你还没有设置 SSH 密钥,请点击这里查看设置 SSH 密钥指南(后期 LinuxStory 考虑是否翻译)来设置你的 SSH 密钥,以便访问你的服务器。
如果你能使用 SSH 连接到你的主机上的话,那么你已经完成所有必要的使用 SFTP 来管理你的文件的要求了。使用下面的命令来测试 SSH 访问:
ssh username@remote_hostname_or_IP
如果上一条命令成功,输入这个的命令退出:
exit
建立一个 SSH 连接打开一个 SFTP 会话。这个过程可使用下面命令:
sftp username@remote_hostname_or_IP
这样,你就连接上远程系统了,你的提示符也会变为 SFTP 提示符。
在 SFTP 命令行中查看帮助文档
老规矩,先了解最有用的命令—— help ,它会提供给你 SFTP 的帮助概览。你可以输入下面两个中的任何一个来打开帮助:
help
?
之后,会显示如下可使用的命令列表:
Available commands: bye Quit sftp cd path Change remote directory to 'path' chgrp grp path Change group of file 'path' to 'grp' chmod mode path Change permissions of file 'path' to 'mode' chown own path Change owner of file 'path' to 'own'df [-hi] [path] Display statistics for current directory or filesystem containing 'path' exit Quit sftp get [-Ppr] remote [local] Download file help Display this help text lcd path Change local directory to 'path' . . .
接下来,我们会探讨以上某些命令。
SFTP Shell 基本操作
我们可以使用大部分类似在本机 Shell 的命令来浏览整个目录结构。
首先,我们要确定当前工作目录,怎么确定呢?与大部分的 Shell 会话类似的可以输入以下命令来获取当前目录信息:
pwd
Remote working directory:/home/demouser
另一个熟悉的命令—— ls,查看当前目录下的内容
ls
Summary.txt info.txt temp.txt testDirectory
值得注意的是, SFTP 的命令行没有像 Bash 这样的一般 Shell 功能丰富,只是选择性的实现了一些重要参数:
ls -la
drwxr-xr-x 5 demouser demouser 4096 Aug 13 15:11 . drwxr-xr-x 3 root root 4096 Aug 13 15:02 .. -rw------- 1 demouser demouser 5 Aug 13 15:04 .bash_history -rw-r--r-- 1 demouser demouser 220 Aug 13 15:02 .bash_logout -rw-r--r-- 1 demouser demouser 3486 Aug 13 15:02 .bashrc drwx------ 2 demouser demouser 4096 Aug 13 15:04 .cache -rw-r--r-- 1 demouser demouser 675 Aug 13 15:02 .profile . . .
使用下面的命令可以切换到另一个目录:
cd testDirectory
现在我们就可以遍历远程文件系统了!但是如果我们需要访问本地文件系统,要怎么办呢?我们只需要给刚才的这些命令加一个前缀“ l ”( L 的小写),即可实现对本地主机操作。
到目前为止,我们谈到的所有命令都有对应的本地版,我们可以这样打印出本地主机工作目录:
lpwd
Local working directory:/Users/demouser
同样,我们这样可以列出本机上当前工作目录的内容:
lls
Desktop local.txt test.html Documents analysis.rtf zebra.html
显然,我们也可以很方便的在一个 Shell 里任意切换本地主机和远程主机的当前工作目录:
lcd Desktop
使用 SFTP 传输文件
仅仅访问两个文件系统之间的内容却不能在本地和远程文件系统之间传输文件,那简直就是牛鼎烹鸡。
下载远程文件到本地主机
如果我们想从远程主机上下载文件,跟着我这样做:
get remote_file_name
Fetching /home/demouser/remoteFile to remote_file_name /home/demouser/remote_file_name 100% 37KB 36.8KB/s 00:01
正如你看到的,在默认情况下,“ get ”命令把远程主机上的文件下载到本地主机而且保证文件名不变。
想改变名字?没问题!直接指定一个不同的文件名来复制远程文件即可:
get remote_file_name local_file_name
说到这里,不得不告诉你,“ get ”命令还有一些可选参数。比如,我们可以打开递归选项来递归的复制一个文件夹里面的内容:
get -r some_directory_name
我们还可以打开“ -P ”或者“ -p ”参数来告诉 SFTP 保持文件的权限访问位的设置和访问时间:
get -Pr some_directory_name
上传本地文件到远程主机
使用见名知意的“ put ”命令可以很容易的将文件上传到远程主机:
put local_file_name
Uploading localFile to /home/demouser/local_file_name local_file_name 100% 7607 7.4KB/s 00:00
” put “具有类似“ get ”的参数。这样,你可以上传整个文件夹:
put -r local_directory_name
注意
在目前发布的 Ubuntu 系统(至少是 14.04-15.10 )上运行的 OpenSSH 版本有一个 BUG ,执行以上命令会报错。使用有BUG 的 OpenSSH 时,在执行上述命令传输文件到服务器上时,会报这样的错:
Couldn't canonicalise: No such file or directory
要解决这个问题,可以输入
mkdir local_directory_name
在远程系统上先新建目标目录。这样之后,执行上面的命令应该就不会报错了。
在我们下载和上传文件时使用到一个大家熟知而且很有用的工具——“ df ”命令,和其他命令行里工作方式相同。通过它,你可以检查是否有足够的空间来完成你想要传输的文件:
df -h
Size Used Avail (root) %Capacity 19.9GB 1016MB 17.9GB 18.9GB 4%
请注意!这个命令没有对应的 ldf ,但我们可以使用“ ! ”这个命令达到相同目的。(说到这里,想起 LinuxStory 有一篇文章《 Linux 命令行下” ! ”的十个神奇用法》,很不错,推荐给没看到的小伙伴,点击这里获取。)
这个“ ! ”(半角叹号)命令把我们带回到本地 Shell ,在这里可以运行所有在我们本地系统可用的命令。通过输入下面命令来检查我们的硬盘使用情况:
!
df -h
Filesystem Size Used Avail Capacity Mounted on /dev/disk0s2 595Gi 52Gi 544Gi 9% / devfs 181Ki 181Ki 0Bi 100% /dev map -hosts 0Bi 0Bi 0Bi 100% /net map auto_home 0Bi 0Bi 0Bi 100% /home
像这样,任何其他的本地命令都会如你期望的那样有效。返回 SFTP 会话,输入:
exit
现在,你应该就能看到 SFTP 提示符又回来了。
其实还可以不退出 SFTP Shell 执行本地主机命令,如果你在 VIM 里面执行过 Shell 指令,我想你应该明白什么意思。
使用 SFTP 进行简单的文件操作
SFTP 允许你执行基本的文件维护类型,在有文件系统的时候很有用。
例如,你可以使用下面命令更改远程系统上的文件所有者:
chown userID file
请注意,和系统“ chmod ”命令不同,这个 SFTP 命令不接受用户名,取而代之的是用户的 UID 。不幸的是,没有简便的方法通过 SFTP 接口得到相应的 UID 。
这个棘手的问题可以使用这个命令解决:
get /etc/passwd !less passwd
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh . . .
请注意,是“ ! ”而不是“ l ”,这和之前的“ l ”前缀不一样,使用它我们可以像在 VIM 里面一样的方式执行本地 Shell 指令。之前就已经在本地“ df ”命令上使用过。
UID 会出现在文件中的第三列,通过冒号界定。
同样,我们可以更改文件属组:
chgrp groupID file
再次提醒,想要得到远程系统的 GID 也不是那么简单的。我们可以用同样的方式来解决:
get /etc/group !less group
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: lp:x:7: . . .
显然我们可以看到第三列就是对应第一列用户所在组的 GID 。这就是我们要找的东西!
幸运的是,这个“ chmod ”命令可以在远程文件系统上执行这样的指令:
chmod 777 publicFile
Changing mode on /home/demouser/publicFile
虽然没有现成的命令来操作本地文件权限,但是你可以设置本地的 umask 。这样,任何复制到本地系统的文件都有相应的权限。
使用“ lumask ”命令来完成这个操作:
lumask 022
Local umask: 022
现在所有的常规文件下载(只要没有打开“ -p ”参数)都会有 644 权限。
SFTP 允许你在本地文件系统和远程文件系统上新建目录,分别使用 ” lmkdir ” 和 ” mkdir “命令,这绝对有用!
这剩下的文件命令就只有针对远程文件系统的了:
ln rm rmdir
这些命令复制 Shell 版本的基本特性。如果你需要在本地文件系统执行这些操作,请记住,你可以输入这个命令切换至 Shell :
!
或者在本地系统执行这一个加“ ! ”前缀的命令,像这样:
!chmod 644 somefile
当你完成了 SFTP 会话,使用“ exit ”或者“ bye ”来关闭连接:
bye
总结
虽然 SFTP 是一个很简单的工具,但用它来管理服务器并在客户端与服务器之间传输文件是非常方便的。
如果你习惯使用 FTP 或者 SCP 来实现你的传输,那么,你可以试试 SFTP ,它集两家之所长。虽然它不是在所有的情况下都如你所愿,但它是一个灵活的工具,值得加入你的技能库!
By Justin Ellingwood
原文链接:
https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server
相关推荐
- Linux下C++访问web—使用libcurl库调用http接口发送解析json数据
-
一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...
- 干货 | 这 3 个超经典的Linux实战项目,让你分分钟入门Linux系统
-
编译安装nginx搭建小游戏网站编译安装流程下载nginx代码wget-P/server/tools/http:nginx.org/download/nginx1.22.0.tar.gz解压并进...
- 权限管理-树莓派linux⑦
-
前言当你在看这篇README,我感到非常荣幸。作为支持开源、分享的理念的我,给大家带来一些学习上的乐趣。由于本人并非专业的教育领域人士,很多时候天马行空,随心所欲的表达方式,可能让部分人感到不适。请根...
- 每天Linux学习:linux文件属性
-
ls-lih先通过这个命令来观察(-l列表显示目录内容详细,-i第一列显示inode,-h将文件大小显示为我们常见的kb,mb等单位)从截图中我们能看出文件属性由这9列信息组成:第1列:inod...
- Linux ln、unlink命令用法
-
ln命令可以用来创建软链接或硬链接。1.创建软链接:ln-s源文件目标文件例如:ln-s/usr/lib/libc.so/usr/local/lib/libc.so.6这样就创建了一...
- Linux 系统启动完整流程
-
一、启动系统流程简介如上图,简述系统启动的大概流程:1:硬件引导UEFi或BIOS初始化,运行POST开机自检2:grub2引导阶段系统固件会从MBR中读取启动加载器,然后将控制权交给启动加载器GRU...
- 最火的 CI/CD 平台 Jenkins 详细搭建教程(for Linux)
-
在正式学习Jenkins之前我们需要对两个名词有一定了解,其一是DevOps,另外一个就是CI/CD。何为DevOps?来自wiki百科介绍DevOps是一系列软件开发实践,强调开发人员(Dev)和测...
- hadoop集群搭建详细方法
-
第一步:搭建配置新的虚拟机格式化之前先把tmp目录下所有与Hadoop有关的信息全部删除rm-rf/tmp/hadoop-centos*开启之后jps只有Java的进程:sudovi/et...
- Linux 常用命令集合
-
系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...
- inode文件索引,你了解嘛?你的Linux基础真的扎实嘛?
-
一、inode是什么?深入了解inode,就要从文件存储说起来!文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节。读取硬盘的时候,不会一个个扇区地读取,这样效率...
- linux实例之创建service服务
-
前面我们讲过可以通过service命令来启动,重启,停止指定的服务程序。service服务可以在系统启动时,自动运行该服务,我们可以利用这一特点,创建service文件,并且让系统重启时,自动执行命令...
- linux之软连接和硬连接的区别
-
硬连接硬链接是通过索引节点进行的链接。在Linux中,多个文件指向同一个索引节点是允许的,像这样的链接就是硬链接。硬链接只能在同一文件系统中的文件之间进行链接,不能对目录进行创建。如果删除硬链接对应的...
- Linux inode 详解
-
简介索引节点(IndexNode)是Linux/类unix系统文件系统上的一种数据结构,用于存储有关文件或目录的元数据。它包含文件的所有信息,除了文件名和数据。inode在文件系统如何存储和检...
- Bash 脚本实例:获取符号链接的目标位置
-
我们都熟悉Linux中的符号链接,通常称为符号链接或软链接,符号链接是指向任何文件系统中的另一个文件或目录的特定文件。本文将介绍Linux中符号链接的基础知识,并创建一个简单的bash脚本...
- windows快捷方式,符号链接,软链接和硬链接
-
当一个软件大量的向C盘写入数据,而我们又无法修改软件保存数据的位置时,可以使用windows系统的“符号链接”(SymbolicLink)功能,将保存数据的位置修改到其它分区中。符号链接类似于我们熟...
你 发表评论:
欢迎- 一周热门
-
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WindowsServer2022|配置NTP服务器的命令
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)