sftp昨天我可以在RHEL 5.4 box (RedHat) 上做,今天我不能。
消息是"Received message too long 778199411",经过一些调查,这是由于我的 RHEL 盒子.bashrc有一条线echo "running .bashrc"- 或者我认为根本没有回声。
那么为什么打印出一行会影响sftp?感觉有点像设计问题,因为.bashrc在其他情况下(例如登录或)打印出工作中的一行,ssh并且在sftp由于这种奇怪的原因失败时很难追踪。
所以问题是,为什么打印出一行会导致这样的错误,如果我们仍然喜欢打印出一些东西.bashrc怎么办?(主要是查看此文件何时获得/执行)。
小智 34
这是一个长期存在的问题。十年前,当我第一次不得不在工作中混合使用商业 SSH 和在家中使用 open-SSH 时,我发现了它。我今天再次遇到它并找到了这篇文章。
如果我搜索了“sftp/scp 失败但 ssh 正常”,我会更快地被提醒解决方案!
简而言之,.bashrc, .bash_profile, .cshrc,.profile等对于非交互式会话必须保持沉默,否则它们会干扰 sftp / scp 连接协议。
此输出会混淆 sftp/scp 客户端。您可以通过执行以下命令来验证您的 shell 是否正在执行此操作:ssh yourhost /usr/bin/true如果上述命令产生任何输出,那么您需要修改您的 shell 初始化。
来自 open-SSH 常见问题解答: 2.9 - sftp/scp 连接失败,但 ssh 正常。
小智 22
至少对于 SFTP,这可以通过使用internal-sftp子系统来修复,因为它不读取.bashrc或/etc/motd.
只需更改/etc/ssh/sshd_config文件并更改 SFTP 子系统:
#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp
Run Code Online (Sandbox Code Playgroud)
错误消失了。
Sco*_*and 12
如果该 id 使用 bash,只需将以下内容放入远程计算机上 id 用户名的 ~/.bashrc 顶部
# If not running interactively, don't do anything and return early
[[ $- == *i* ]] || return
Run Code Online (Sandbox Code Playgroud)
它只是从 ~/.bashrc 提前退出,而不是获取整个文件...这解决了当您没有登录该 id 并且只是使用该用户名作为远程 id 运行 scp 或 sftp 时使 .bashrc 保持沉默...在其他答案中引用@Peter Scott:“简单地说,.bashrc 和 .bash_profile 等必须保持沉默,否则它们会干扰 sftp / scp 连接协议。”
或者,如果该远程 ID 使用 zsh,则将以下内容放在其 ~/.zshrc 顶部
# If not running interactively, don't do anything and return early
[[ -o interactive ]] || exit 0
Run Code Online (Sandbox Code Playgroud)
如果远程计算机上的 shell 不使用 ~/.bashrc,则在文件 ~/.bashrc_profile 或 ~/.profile 或类似文件中进行上述编辑,以适合该远程机器上的 shell
....更新...通过将上面的代码片段放入远程盒子上的用户的文件 ~/.bashrc 顶部,任何 ssh 连接都将源文件 ~/.bashrc ,该文件将简单地读取 ~/.bashrc 直到看到此代码片段然后停止继续获取文件 ~/.bashrc 的其余部分,以避免使用 ssh 连接不需要也不想要的东西污染该远程机器上的外壳...不要将代码片段放入任何必须获取或执行完成的文件中,如下所示此代码片段的要点是从源文件 ~/.bashrc 中提前退出(注意,源文件与执行文件之间存在差异)...文件 ~/.bashrc 始终源源代码从未执行