SFTP错误"收到的消息太长"

Nic*_*ang 7 linux sftp

我最近尝试使用sftp来访问我的linux盒子,在那里我实现了一个我自己的简单shell.我设置除root之外的用户默认使用mine shell(通过编辑/ etc/passwd文件).然后出现问题,一旦我尝试通过sftp访问,我将收到一条消息"收到的消息太长了:",我搜索了解决方案,一个解决方案是将此用户的默认shell更改回正常的bash shell.我试过这样,它有效,问题是有没有办法,我仍然可以使用自己的shell,并允许sftp通过?请回答我更详细的信息,比如我应该去编辑哪个文件等.先谢谢:)

sal*_*lva 18

配置服务器以使用内部sftp服务器将以下指令添加到/etc/ssh/sshd_config:

Subsystem sftp internal-sftp
Run Code Online (Sandbox Code Playgroud)

这样,它就不会使用用户shell来启动sftp服务器程序.

  • 很好,谢谢。我还必须添加一个sudo service sshd restart,然后重新启动了sftp守护进程(sudo service vsftpd restart)。 (3认同)

Ken*_*ter 7

“Received message too long”表示您的 SFTP 客户端从 SFTP 服务器接收到错误数据。典型的原因是服务器上的 shell 启动脚本(.bashrc、.profile、.cshrc 等)正在生成一些输出,而您的 SFTP 客户端正在尝试将该输出解析为 SFTP 消息。您可以通过运行以下命令来检查这一点:

ssh user@remote 'echo hello'
Run Code Online (Sandbox Code Playgroud)

如果这会产生除“hello”之外的任何输出,那么该输出可能会阻止 SFTP 或 SCP 正常工作。

正如在 Salva 的回答中一样,您可以通过将 SSH 服务器设置为对 SFTP 会话使用internal-sftp来避免这种情况。这避免了为 SFTP 会话启动 shell。这对 SCP 或其他程序(如通过 ssh 运行的 git 或 rsync)没有帮助。

解决此问题的另一种方法是检查您的 shell 启动命令,找出产生输出的原因,并防止在非交互式 SSH 会话期间发生这种情况。一个技巧是在运行产生输出的命令之前测试 TTY:

if [ -t 1 ]; then
    # standard output is a TTY
    ...
fi
Run Code Online (Sandbox Code Playgroud)