一、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 | Host RemoteHostAlias #指定配置匹配条件 |
另外还有两个比较有用的选项:
- -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 | cd |
2、针对本地机器来说
1 | lcd |
3、其他
1 | get -r:从远端主机复制文件到本地,加了r选项表示允许递归复制目录,不会解析遇到的软符号链接 |
参考文献
[1]man sftp
[2]man 8 sftp-server
[3]man 5 sshd_config