文章目录
- SFTP
- SSH 文件传输协议
- 连接
- 获取SFTP帮助
- 查看及切换路径
- 遍历远程文件系统
- 访问本地的文件系统
- 传输文件
- 传输本地文件到远程服务器
- 简单的文件操作
- 图形界面程序
- Reference
- 欢迎关注公众号【三戒纪元】
SSH 文件传输协议
FTP,即文件传输协议,是一种流行的、未加密的在两个远程系统之间传输文件的方法。
在计算机领域,SSH文件传输协议(英语:SSH File Transfer Protocol,也称Secure File Transfer Protocol,中文:安全文件传送协议,英文:Secure FTP或字母缩写:SFTP)是一数据流连线,提供文件存取、传输和管理功能的网络传输协议。
由互联网工程任务组(IETF)设计,透过SSH 2.0 的扩展提供安全文件传输能力,但也能够被其他协议使用。
即使IETF在网络草案资料阶段时,这个协议是在SSH-2文件中描述,它能够使用在许多不同的应用程序,例如安全文件传输在传输层安全(TLS)和传输信息管理于虚拟专用网应用程序。
这个协议是假设执行在安全信道,例如SSH,服务器已经认证客户端,并且客户端用户可利用协议。
与 FTP 协议相比,在几乎所有情况下,SFTP 都比 FTP 更可靠,因为它具有潜在的安全功能并且能够搭载 SSH 连接。 FTP 是一种不安全的协议,只能在有限的情况下或您信任的网络上使用。
连接
默认情况下,SFTP 使用 SSH 协议进行身份验证并建立安全连接。 因此,可以使用 SSH 中存在的相同身份验证方法。
虽然默认情况下可以使用密码进行身份验证,但建议创建 SSH 密钥并将您的公钥传输到您需要访问的任何系统。 这更加安全,从长远来看可以节省您的时间。
首先测试 SSH连接是否有效
ssh randy@your_server_ip_or_remote_hostname
(base) qiancj@qiancj-HP-ZBook-G8:~$ ssh randy@10.88.2.13
sesame@10.XXX.XXX.XXX's password:
Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 5.4.0-97-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
531 updates can be applied immediately.
260 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable
New release '20.04.6 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Your Hardware Enablement Stack (HWE) is supported until April 2023.
Last login: Fri Jun 2 16:41:51 2023 from 10.78.3.19
如果上述有效,则退出
exit
(base) sesame@SanJie:~$ exit
logout
Connection to 10.88.2.13 closed.
现在建立SFTP会话:
sftp randy@your_server_ip_or_remote_hostname
(base) qiancj@qiancj-HP-ZBook-G8:~$ sftp sesame@10.88.2.13
sesame@10.88.2.13's password:
Connected to 10.88.2.13.
此时连接到远程系统,提示也会更改为sftp的提示
如果使用了自定义的SSH 端口号(默认为22),打开SFTP会话时可以设定端口号
sftp -oPort=custom_port randy@your_server_ip_or_remote_hostname
这样会通过指定的端口连接到远程系统
获取SFTP帮助
使用命令:
sftp> help
或
sftp> ?
结果如下:
sftp> help
Available commands:
bye Quit sftp
cd path Change remote directory to 'path'
chgrp [-h] grp path Change group of file 'path' to 'grp'
chmod [-h] mode path Change permissions of file 'path' to 'mode'
chown [-h] 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 [-afpR] remote [local] Download file
help Display this help text
lcd path Change local directory to 'path'
lls [ls-options [path]] Display local directory listing
lmkdir path Create local directory
ln [-s] oldpath newpath Link remote file (-s for symlink)
lpwd Print local working directory
ls [-1afhlnrSt] [path] Display remote directory listing
lumask umask Set local umask to 'umask'
mkdir path Create remote directory
progress Toggle display of progress meter
put [-afpR] local [remote] Upload file
pwd Display remote working directory
quit Quit sftp
reget [-fpR] remote [local] Resume download file
rename oldpath newpath Rename remote file
reput [-fpR] local [remote] Resume upload file
rm path Delete remote file
rmdir path Remove remote directory
symlink oldpath newpath Symlink remote file
version Show SFTP version
!command Execute 'command' in local shell
! Escape to local shell
? Synonym for help
查看及切换路径
遍历远程文件系统
我们可以使用一些功能类似于 shell 命令的命令来浏览远程系统的文件层次结构。
首先,通过找出我们当前在远程系统上的哪个目录来定位自己
sftp>pwd
sftp> pwd
Remote working directory: /home/sesame
查看远程系统当前目录的内容
sftp>ls
sftp> ls
Cognata Desktop
Documents Downloads
nohup.out opt
pangweisong qiancj
set_iptables.sh shared_dir
请注意,SFTP 界面中可用的命令不是典型 shell 语法的 1:1 匹配,也不是功能丰富的。
但是,它们确实实现了一些更重要的可选标志,例如将 -la
添加到 ls
以查看更多文件元数据和权限:
sftp>ls -la
Outputdrwxr-xr-x 5 remote_money remote_money 4096 Aug 13 15:11 .
drwxr-xr-x 3 root root 4096 Aug 13 15:02 ..
-rw------- 1 remote_money remote_money 5 Aug 13 15:04 .bash_history
-rw-r--r-- 1 remote_money remote_money 220 Aug 13 15:02 .bash_logout
-rw-r--r-- 1 remote_money remote_money 3486 Aug 13 15:02 .bashrc
drwx------ 2 remote_money remote_money 4096 Aug 13 15:04 .cache
-rw-r--r-- 1 remote_money remote_money 675 Aug 13 15:02 .profile
. . .
进入到其他目录
sftp>cd testDirectory
sftp> cd qiancj
访问本地的文件系统
通过在命令前面加上一个 l(local)
来将命令指向本地文件系统。
sftp>lpwd
sftp> lpwd
Local working directory: /home/qiancj
sftp> lcd /home/qiancj/codes/sanjie
列出本地机器上当前目录的内容
sftp> lls
sftp> lls
ai_toolchain docker_backup Music opt randy_File tools
anaconda3 Documents node_modules package.json README.en.md Videos
bin Downloads package-lock.json README.md
codes Edraw pcl_tar rviz wget-log
commandsQCJ eval NVIDIA_CUDA-11.4_Samples Pictures shell
data happyRandy.sh obsutil_linux_amd64.tar.gz QCJLogo.sh tag
Desktop Legend.md open3d_data Q.png Template
更改目录:
sftp> lcd Desktop
sftp> lcd ..
传输文件
从远程系统上下载文件到本地
sftp> get remoteFile
OutputFetching /home/remote_money/remoteFile to remoteFile
/home/remote_money/remoteFile 100% 37KB 36.8KB/s 00:01
下载到本地并重命名
sftp> get remoteFile localFile
get
命令可以增加可选项,比如要拷贝目录及其下所有文件,可以使用-r
选项
sftp> get -r someDirectory
使用 -P
或 -p
标志维护适当的权限和访问时间
sftp> get -Pr someDirectory
传输本地文件到远程服务器
使用 put
命令:
sftp> put localFile
结果:
sftp> put app_meta_randy.tar.gz ./
Uploading app_meta_randy.tar.gz to /home/sesame/qiancj/./app_meta_randy.tar.gz
如果要传输文件夹及其内的文件,使用 put -r
:
sftp> put -r localDirectory
sftp> put -r app_meta_randy/ ./
Uploading app_meta_randy/ to /home/sesame/qiancj/./app_meta_randy
Entering app_meta_randy/
Entering app_meta_randy/bin
app_meta_randy/bin/app_meta_randy 100% 291KB 30.5MB/s 00:00
app_meta_randy/start_nginx.sh 100% 221 244.9KB/s 00:00
app_meta_randy/run.sh 100% 1119 1.3MB/s 00:00
Entering app_meta_randy/etc
app_meta_randy/etc/obstacle_segmentation.yaml 100% 2563 1.9MB/s 00:00
app_meta_randy/etc/preprocess.yaml 100% 823 955.9KB/s 00:00
app_meta_randy/etc/freespace.yaml 100% 495 578.5KB/s 00:00
app_meta_randy/etc/visual.yaml 100% 246 303.3KB/s 00:00
app_meta_randy/etc/postprocess.yaml
....
下载和上传文件时有用的一个熟悉的工具是 df 命令,它的工作方式类似于命令行版本。
使用它,可以检查您是否有足够的空间来完成您感兴趣的传输:
sftp> df -h
Copy
Output Size Used Avail (root) %Capacity
19.9GB 1016MB 17.9GB 18.9GB 4%
请注意,此命令没有本地变体,但我们可以通过发出 !
命令来解决这个问题。
!
命令将我们带入本地 shell,我们可以在其中运行本地系统上可用的任何命令。 我们可以通过键入以下内容来检查磁盘使用情况:
sftp> !
然后回到了本地系统
df -h
OutputFilesystem Size Used Avail Capacity Mounted on
/dev/disk0s3 520Gi 52Gi 522Gi 9% /
devfs 188Ki 288Ki 0Bi 100% /dev
map -hosts 0Bi 0Bi 0Bi 100% /net
map auto_home 0Bi 0Bi 0Bi 100% /home
返回到SFTP的会话:
exit
简单的文件操作
SFTP 允许执行某些类型的文件系统内务处理。 例如,可以更改远程系统上文件的所有者:
sftp> chown userID file
请注意,与系统 chmod
命令不同,SFTP 命令不接受用户名,而是使用 UID。
而且,没有内置的方法可以从 SFTP 接口中知道适当的 UID。
作为解决方法,可以从“/etc/passwd”文件中读取,该文件在大多数 Linux 环境中将用户名与 UID 相关联:
sftp> get /etc/passwd
sftp> !less passwd
Outputroot: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
. . .
请注意,这里不是单独给出 !
命令,而是将其用作本地 shell 命令的前缀。 这适用于运行我们本地机器上可用的任何命令,并且可以更早地与本地 df
命令一起使用。
UID 将位于文件的第三列,由冒号字符划定。
同样,我们可以更改文件的组所有者:
sftp> chgrp groupID file
同样,没有内置的方法来获取远程系统组的列表。 我们可以使用以下命令解决它:
sftp> get /etc/group
sftp> !less group
结果:
Outputroot:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
. . .
第三列包含与第一列中的名称关联的组的 ID。
chmod
SFTP 命令在远程文件系统上正常工作:
sftp> chmod 777 publicFile
结果:
OutputChanging mode on /home/remote_money/publicFile
没有等效的命令来操作本地文件权限,但可以设置本地 umask,以便复制到本地系统的任何文件都将具有其相应的权限。
这可以通过 lumask
命令来完成:
sftp> lumask 022
结果
OutputLocal umask: 022
现在所有下载的常规文件(只要不使用 -p
标志)都将具有 644 权限。
SFTP 还允许分别使用 lmkdir
和 mkdir
在本地和远程系统上创建目录。
其余文件命令仅针对远程文件系统:
sftp> ln
sftp> rm
sftp> rmdir
这些命令复制了它们的 shell 等价物的核心行为。 如果您需要在本地文件系统上执行这些操作,请记住可以通过发出以下命令进入 shell:
sftp> !
或者通过在命令前加上 !
在本地系统上执行单个命令:
sftp> !chmod 644 somefile
完成 SFTP 会话后,使用“exit”或“bye”关闭连接。
sftp> bye
图形界面程序
当然可以使用 FileZilla ,XFTP等图形界面程序,设置好站点,以图形文件夹形式展示本地文件和服务器端文件,可直接左右拖拽文件到目标文件夹,方便电脑直接文件传输
FileZilla 界面:
设置站点
Reference
- SSH文件传输协议
- Linux 命令详解:SFTP
- How To Use SFTP to Securely Transfer Files with a Remote Server