SFTP是否需要双向访问

use*_*952 3 port sftp bidirectional

我有以下脚本通过接受以下参数从给定的远程目录获取给定文件

  1. 您要连接的主机名以获取文件
  2. 主机的用户名
  3. 您要传输文件的本地目录
  4. 您想要获取文件的远程目录
  5. 您希望从远程服务器获取的文件名
FSERVER=$1
FUSER=$2
SRC_DIR=$3
REMOTE_SRC_DIR=$4
FILE_NAME=$5

cd $SRC_DIR
sftp $FUSER@$FSERVER <<GOTO
cd $REMOTE_SRC_DIR 
ascii
get $FILE_NAME 
bye
Run Code Online (Sandbox Code Playgroud)

要访问从文件$REMOTE_SRC_DIRSRC_DIR我需要的端口从两侧打开?即双向或从远程服务器到源的一个端口,它应该需要来自源的"初始化"会话.那是什么原因?

根据我的理解,我们连接到远程服务器路径,然后编写查询获取文件名.所以我们需要双向访问.

Mar*_*ryl 5

SFTP使用单个TCP连接.通常,TCP连接是有状态的.因此,一旦打开双方都可以相互发送数据.只有连接的被动端需要最初打开一个众所周知的端口号(在这种情况下,SSH/SFTP为22).活动侧打开一个随机端口号,被动端从打包的TCP连接启动中学习.此被动端口通过TCP连接关闭.而活动端口保持打开以供将来的TCP连接使用.

SFTP协议严格使用请求 - 响应模型.即尽管TCP允许双方随时使用SFTP发送数据,但服务器不会自己发送数据,而是始终响应客户端请求.请注意,这并不意味着,在网络级别上没有未经请求的数据从服务器流向客户端,因为在SFTP的两个底层协议(TCP和SSH)中,连接的两端都可以随时发送(和发送)数据包.

简化的流程是:

  1. SFTP客户端启动到远程端口22的TCP连接(这导致在客户端隐式打开随机本地端口,这由操作系统完成).
  2. 发生SSH协议初始化和身份验证.
  3. SFTP客户端请求SSH服务器启动SFTP服务器.请注意,SFTP服务器不是持续运行的进程.它是SSH服务器的子进程/子服务,它连续运行(=侦听端口22)
  4. 发生SFTP协议初始化.
  5. SFTP(与FTP协议相反)是无状态的,因此它没有工作目录的概念.因此,cd在客户端模拟使用该命令更改远程工作目录.SFTP服务器无法识别所有客户端远程工作目录.SFTP客户端通常仅验证SFTP服务器是否存在新的工作目录.
  6. ascii命令:OpenSSH的sftp客户端没有ascii命令.你应该得到"无效的命令".除非您使用其他客户端而不是OpenSSH.
  7. get命令:对于文件传输SFTP协议提供了类似的块级API作为大多数操作系统(违背FTP协议流API).因此,SFTP客户端通过现有连接发送"打开文件"请求,然后是重复的"读取块"请求和"关闭文件"请求.与任何SFTP请求一样,响应通过相同的TCP连接返回.
  8. 最后,TCP连接终止,特定于连接的随机本地端口关闭.