0%

OpenSSH中SFTP协议实现相关程序

一、OpenSSH中SFTP协议实现相关程序

OpenSSH中SFTP协议实现的相关程序有:sftp和sftp-server[2]。
sftp程序实现SFTP协议中的SFTP-Client,sftp-server实现SFTP协议中的SFTP-Server。

备注

  • sftp程序路径为:/usr/bin/sftp
  • sftp-server程序路径为:/usr/lib/openssh/sftp-server

二、工作原理

1、sftp-server是被触发运行
sftp-server跟常见的Server不太一样,不是“持续运行,监听端口”的,而是被触发运行的(比如MySQL Server“持续运行,监听3306端口”)。具体是由SSH Server(在OpenSSH中是sshd程序)触发的。
其实可以在sshd程序使用的sshd_config文件中配置需要触发运行的“SFTP协议中SFTP-Server的具体实现程序”,默认配置的就是sftp-server这个实现程序,可以改成使用internal-sftp。[3]
当sshd程序刚开始运行的时候并不需要加载sftp-server这个程序,只有在向sshd程序发送sftp请求的时候才会去加载运行sftp-server程序,这个论述可以通过以下实验证明:
0. 直接加载运行sshd程序,不会产生sftp-server进程,然后向sshd发送sftp请求,发现产生了sftp-server进程
0. 如果首先将“/usr/lib/openssh/sftp-server”移除,然后重新加载运行sshd程序,发现不会产生任何错误,能够正常工作,也没有产生sftp-server进程,然后向sshd发送sftp请求,发现会出现如图1错误

图1

2、安全数据通道
在sftp和sftp-server的程序实现中,安全的数据通道由SSH连接提供。
3、整个SFTP连接示意图
整个过程的示意图如图2所示。

图2

三、用法介绍

3.1、sftp-server程序

由sshd负责调用,一般不需要特殊配置。

3.2、sftp程序

我们主要来介绍sftp程序的使用用法。
sftp是一个具有交互运行模式的命令,主要工作都可在交互运行模式中进行。

3.2.1、进入交互运行模式

进入交互运行模式:sftp -i identify_file -P port user@remoteHost
-i:选项值被直接传递给底层调用的ssh程序,作为ssh程序中“-i”选项的值
-P:选项值被直接传递给底层调用的ssh程序,作为ssh程序中“-p”选项的值
user:选项值被直接传递给底层调用的ssh程序,作为ssh程序中“-l”选项的值
remoteHost:被直接传递给底层调用的ssh程序,等价于ssh程序中“hostname”

以上这些选项都可在ssh_config文件中配置,以“~/.ssh/config”文件为例,其中增加如下配置内容后,命令可简化为:sftp RemoteHostAlias

1
2
3
4
5
Host RemoteHostAlias #指定配置匹配条件    
HostName remoteHost
User user
Port port
IdentityFile identify_file

另外还有两个比较有用的选项:

  • -D sftp-server-path:表示不是由sshd进程打开sftp-server,而是直接根据sftp-server-path路径打开sftp-server。这样子得到的sftp-server进程的父进程是执行命令的bash进程;如果是由sshd进程打开sftp-server,那么得到的sftp-server进程的父进程是sshd进程
  • -v:表示打印日志信息,这有助于我们进行调试,解决遇到的问题。“-v”选项越多,表示打印的日志信息越详细

3.2.2、交互模式中的命令

进入交互模式中,可以运行一些文件管理命令,这些文件管理命令由sftp进程进行解析运行。sftp交互模式中的这些文件管理命令跟通常的文件管理命令“名称相近,用法相似”。
这些文件管理命令可以分为3个类别:
1、针对远端主机来说

1
2
3
4
5
6
7
8
9
10
11
cd
chgrp grp path[grp是数字形式]
chmod mode path
chown own path[own是数字形式]
ln
ls
mkdir
pwd
rename
rm
rmdir

2、针对本地机器来说

1
2
3
4
lcd
lls(支持的选项跟通常的ls命令一样)
lmkdir
lpwd

3、其他

1
2
3
4
get -r:从远端主机复制文件到本地,加了r选项表示允许递归复制目录,不会解析遇到的软符号链接
progress:切换是否显示进度条
put -r:从本地复制文件到远端主机,加了r选项表示允许递归复制目录,不会解析遇到的软符号链接
exit:退出

参考文献

[1]man sftp
[2]man 8 sftp-server
[3]man 5 sshd_config

您的支持将鼓励我继续分享!