sftp 失败并出现 'message too long' 错误

sftp fails with 'message too long' error

我的 java 程序使用 ssh/sftp 将文件传输到 linux 机器(显然...),而我这样做的库是 JSch(尽管这不是罪魁祸首) .

现在,其中一些 linux 机器具有 shell 登录启动脚本,这不幸地 导致 ssh/sftp 连接失败,并显示以下消息:

Received message too long 1349281116

简单阅读后,这显然是一个已知的 ssh 设计问题(不是错误 - see here)。所有建议的解决方案都在 ssh 服务器端(即禁用在 shell 登录期间输出消息的脚本)。

我的问题 - 是否可以选择在客户端避免此问题?

检查服务器上的 .bashrc 和 .bash_profile,删除任何可以回显的内容。现在,将这些行注释掉。

再试一次。您应该不会再看到此消息。

这是一个速成的解决方案,但它似乎也适用于二进制文件。所有学分归于 uvgroovy.

给定文件 'some-file.txt',只需执行:

cat some-file.txt | ssh root:1.1.1.1 /bin/bash -c "cat > /root/some-new-file.txt"

不过,如果有人知道 sftp/scp 内置的方法 在客户端 ,那就太好了。

我也遇到了这个错误,在 bash 脚本中调用 sftp get 期间。

而且根据 TO 的错误信息,这和我的类似,看起来 sftp 命令的 -B 选项被设置了。虽然 1349281116 字节的缓冲区大小 "a bit" 太高了。

在我的例子中,我也确实明确地设置了缓冲区大小(使用 "good intentions"),这会导致相同的错误消息,然后是我的设置值。

删除强制值并让默认值为 32K 的 sftp 运行 解决了我的问题。

-B buffer_size
         Specify the size of the buffer that sftp uses when transferring
         files. Larger buffers require fewer round trips at the cost of 
         higher memory consumption. The default is 32768 bytes.

如果确认是同一个问题, 可以作为 客户端 解决方案。

注意:我必须修复 远程 主机上的 .bashrc 输出,而不是发出 scp 或 sftp 命令的主机。

将以下内容放入文件 ~/.bashrc 的顶部,在远程计算机上使用 id 的用户名

# If not running interactively, don't do anything just return early from .bashrc
[[ $- == *i* ]] || return  

这只会提前从 .bashrc 中退出,而不是在对目标远程计算机执行 scp 或 sftp 时获取您不需要的整个文件...取决于该远程用户名的 shell,在 ~/.bashrc 上进行此编辑 或 ~/.bash_profile 或 ~/.profile 或类似的