SFTP是否需要双向访问

时间:2014-04-07 19:24:47

标签: port sftp bidirectional

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

  1. 您要连接的主机名以获取文件
  2. 主机的用户名
  3. 您要传输文件的本地目录
  4. 您想要获取文件的远程目录
  5. 您希望从远程服务器获取的文件名
  6.  
    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
    

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

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

1 个答案:

答案 0 :(得分: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连接终止,特定于连接的随机本地端口关闭。