使用命令行SSH调用子系统SFTP

时间:2016-10-14 11:32:05

标签: ssh sftp

我遇到的问题是我有一个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会发生什么??服务器端究竟需要什么,或者客户端需要什么来使其工作?

如果我理解错误,请澄清我的基本理解。

1 个答案:

答案 0 :(得分:4)

您期望它做什么?

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

所以它挂了。正如所料。

(请注意,尽管如此,SSH_FXP_INIT是SFTP请求,而不是SSH请求。SSH_FXP代表" SSH f ile e x 更改 p rotocol")

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

所以让我猜一下。

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

即使在理论上,这些文本命令也无法与服务器进行真正的交换。简单的命令,如rm,可以。但是putget呢?如果执行put /local/path,SFTP服务器如何访问本地文件进行读取?这不可以。 SFTP客户端就是这样做的。

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

  

服务器端究竟需要什么,或者客户端需要它才能使其正常工作?

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