我有以下脚本通过接受以下参数来获取给定远程目录中的给定文件
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_DIR
到SRC_DIR
的文件,我是否需要从两侧打开端口?即从远程服务器到源的双向或仅一个端口,它应该需要来自源的“初始化”会话。那是什么原因?
根据我的理解,我们将连接到远程服务器路径,然后编写查询获取文件名。所以我们需要双向访问。
答案 0 :(得分:5)
SFTP使用单个TCP连接。通常,TCP连接是有状态的。因此,一旦打开双方都可以相互发送数据。只有连接的被动端需要最初打开一个众所周知的端口号(在这种情况下,SSH / SFTP为22)。活动侧打开一个随机端口号,被动端从打包的TCP连接启动中学习。此被动端口通过TCP连接关闭。虽然活动端口保持打开以供将来的TCP连接使用。
SFTP协议严格使用请求 - 响应模型。即虽然TCP允许双方随时使用SFTP发送数据,但服务器不会自己发送数据,但始终响应客户端请求。请注意,这并不意味着,在网络级别上没有未经请求的数据从服务器流向客户端,因为在SFTP的两个底层协议(TCP和SSH)中,连接的两端都可以随时发送(和发送)数据包。
简化流程是:
cd
命令更改远程工作目录。 SFTP服务器无法识别所有客户端远程工作目录。 SFTP客户端通常仅验证SFTP服务器是否存在新的工作目录。ascii
命令:OpenSSH sftp
客户端没有ascii
命令。你应该得到“无效命令。”除非你使用其他客户端而不是OpenSSH。get
命令:对于文件传输,SFTP协议提供与大多数操作系统类似的块级API(与FTP协议的流API相反)。因此,SFTP客户端通过现有连接发送“打开文件”请求,然后是重复的“读取块”请求和“关闭文件”请求。与任何SFTP请求一样,响应通过相同的TCP连接返回。