【问题标题】:SSH invocation of a subsystem SFTP using command line使用命令行对子系统 SFTP 进行 SSH 调用
【发布时间】:2016-10-14 21:49:14
【问题描述】:

我遇到了一个问题,我有一个 SFTP 服务器(没有 SSH shell 访问权限)。

当我从客户端机器发出 SFTP 请求时,它可以工作:

sftp username@remote_IP

然后,如果我发出 SSH 请求,它就会挂起

ssh -l username -s remote_IP sftp

ssh 手册页表明

-s      May be used to request invocation of a subsystem on the remote
        system.  Subsystems facilitate the use of SSH as a secure
        transport for other applications (e.g. sftp(1)).  The subsystem
        is specified as the remote command.

远程服务器上的 SSH 服务器是否必须启用此功能,还是有其他方法可以解决此问题?

添加详细日志....首先让我与您分享sftp详细模式日志,其中建议:

debug1: Authentication succeeded (publickey)
debug1: fd 5 setting O_NONBLOCK
debug2: fd 6 is O_NONBLOCK
debug2: TCP receive buffer size: 49640 B
debug1: SSH receive window size: 198560 B
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug1: send channel open 0
debug1: Entering interactive session.
debug2: callback start
debug1: ssh_session2_setup: id 0
debug1: Sending subsystem: sftp
debug1: channel request 0: subsystem
debug2: callback done
debug1: channel 0: open confirm rwindow 2097152 rmax 32768
debug2: Remote version: 3
debug3: Sent message fd 5 T:16 I:1
debug3: SSH_FXP_REALPATH . -> /root
sftp> pwd

现在我正在显示ssh -l username -s remote_IP sftp 的详细输出

debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending subsystem: sftp
debug2: channel 0: request subsystem confirm 1
debug2: fd 4 setting TCP_NODELAY
debug2: callback done
debug2: channel 0: open confirm rwindow 2097152 rmax 32768
debug2: channel_input_status_confirm: type 99 id 0
debug2: subsystem request accepted on channel 0

这就是它挂起的地方。

简而言之,问题是“如果 SFTP 工作并在服务器上启用,ssh 会发生什么情况,它正在远程服务器上调用子系统 sftp?在服务器端或事实上在客户端需要什么才能使其工作?

如果我理解有问题,请澄清我的基本理解。

【问题讨论】:

    标签: ssh sftp


    【解决方案1】:

    你希望它做什么?

    它启动 SFTP 服务器。服务器等待 SFTP 请求,尤其是 SSH_FXP_INIT。它永远不会得到一个。 SSH 终端(ssh)几乎不会发送 SFTP 数据包。

    所以它挂了。正如预期的那样。


    (请注意,尽管相同,SSH_FXP_INIT 是 SFTP 请求,而不是 SSH 请求。SSH_FXP 代表类似“SSH file ex更改 protocol")


    您还没有真正向我们解释您的期望。

    所以让我猜猜。

    您实际上认为 SFTP 是一种文本协议。您在sftp(OpenSSH 命令行 SFTP 客户端)中键入的命令(如rmput 等)是发送到服务器的真实命令。他们不是。 SFTP 是一种二进制协议。这些命令是一种特定 SFTP 客户端实现的专有命令。客户端 (OpenSSH sftp) 将这些文本命令转换为二进制 SFTP 数据包/请求并将它们发送到服务器。然后它将来自 SFTP 服务器的二进制响应转换为人类可读的文本消息。

    那些文本命令即使在理论上也不能与服务器进行真正的交换。可以使用简单的命令,例如 rm。但是putget 呢?如果你做put /local/path,SFTP服务器怎么访问本地文件读取呢?这不可以。 SFTP 客户端会执行此操作。

    这类似于 FTP。 FTP 是一种文本协议。理论上,您可以通过键入命令与 FTP 服务器通信。例如,您可以通过这种方式删除远程文件(使用DELE /path/to/file 命令)。但是您不能以这种方式上传或下载文件。这需要与本地 FTP 软件合作。

    在服务器端或事实上在客户端需要什么才能使其工作?

    您的服务器端按预期工作。但是您需要在客户端有一个实际的 SFTP 客户端。

    【讨论】:

    • 嗨,马丁,感谢您的快速回复,在这种特殊情况下,SSH_FXP_INIT 是由客户端发送的。表示发送了第一个 SFTP 数据包。它也在从服务器接收第二条消息(如wireshark对转储的分析中所见)......仍然客户端挂起
    • 哪个客户端发送SSH_FXP_INIT?没有意义。所以向我们展示转储。
    • 详细说明...客户端挂在调试1:发送子系统:sftp调试2:通道0:请求子系统确认1调试2:fd 4设置TCP_NODELAY调试2:回调完成调试2:通道0:打开确认rwindow 2097152 rmax 32768 debug2:channel_input_status_confirm:类型 99 id 0 debug2:通道 0 上接受子系统请求
    • 这并没有给我们任何我们不知道的信息。它显示没有 SFTP 数据包交换。
    • 简而言之,问题是“如果 SFTP 工作并在服务器上启用,那么在远程服务器上调用子系统 stfp 的 ssh 会发生什么”。服务器端究竟需要什么才能使其工作。
    猜你喜欢
    • 2014-10-08
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多