port - SFTP是否需要双向访问

标签 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

要访问从 $REMOTE_SRC_DIRSRC_DIR 的文件,我需要从两侧打开端口吗? IE。从远程服务器到源的双向或仅一个端口,它应该需要来自源的“INITIATE” session 。原因是什么?

据我了解,我们正在连接到远程服务器路径,然后编写查询“获取文件名”。所以我们需要双向访问。

最佳答案

SFTP 使用单个 TCP 连接。通常,TCP 连接是有状态的。因此,一旦打开,双方就可以相互发送数据。只有连接的被动端需要首先打开一个众所周知的端口号(在这种情况下,SSH/SFTP 为 22)。主动方打开一个随机端口号,被动方从 TCP 连接初始化包中获知。此被动端端口随 TCP 连接关闭。而事件端端口为 future 的 TCP 连接保持打开状态。

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

简化流程是:

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

关于port - SFTP是否需要双向访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22921261/

相关文章:

recursion - jackson :如何通过仅在子集合中添加 ID 字段来防止递归调用

mysql - #1045 - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES)

linux - 在 Windows 机器上安装的 sftp 服务器上是否可以进行基于 ssh key 的身份验证?

tensorflow - Tensorflow中可变长度序列的双向LSTM

ruby - Ruby 中的双向哈希表

ftp - 使用远程 FTP 原子包和私钥发出与服务器的连接

azure - 如何使用 Azure cli 打开出站端口?

port - Heroku 打开 "Puma Port 5000 Already In Use"导轨

android - Android 与通过 Hotspot 连接的设备之间的通信

php - 当 SFTP 主机无效时如何获取正确的错误消息