从 MacOS 到 Ubuntu 的 SFTP 不支持箭头键、退格键或制表符补全

从 MacOS 到 Ubuntu 的 SFTP 不支持箭头键、退格键或制表符补全

当使用 sftp 从 Mac 传输到 Ubuntu 机器时,箭头键、退格键和制表符补全不起作用。具体来说,箭头键和退格键会产生字符序列,而制表符只会插入一个制表符。但是,当使用 sftp 从 Ubuntu 机器传输到 Mac 时,我没有遇到任何问题。我搞不清楚区别在哪里。我的目标是能够通过 sftp 传输到 Ubuntu 机器并使用箭头键、退格键和制表符补全。

壳:

我已经在两台机器上都尝试过了zshbash从 /bin/sh 升级是针对大多数其他类似问题建议的修复方法)

SSHD_配置:

我在 Ubuntu 机器上的 sshd_config 文件中尝试过 和Subsystem sftp /usr/lib/openssh/sftp-server。Mac使用的是。Subsystem sftp internal-sftp/usr/libexec/sftp-server

我意识到这些设置不同,所以我怀疑这导致了差异,但我不知道确切了解这种差异是什么,也不知道如何解决它。我也找不到关于这些不同的 sftp 服务器是什么的文档。

感谢您的任何建议!

答案1

在终端中输入:

which sftp

如果结果为/usr/bin/sftp,则表示您使用的 macOS 内置 SFTP 版本与 GNU 版本相比已过时。更多详细信息这里

你可以安装 Homebrew 版本(GNU 版本)

brew install openssh

并列出openssh安装路径:

brew list openssh

例如,您会在这里看到一些二进制文件:

/usr/local/Cellar/openssh/8.4p1_2/.bottle/etc/ (12 files)
/usr/local/Cellar/openssh/8.4p1_2/bin/scp
/usr/local/Cellar/openssh/8.4p1_2/bin/sftp
/usr/local/Cellar/openssh/8.4p1_2/bin/slogin
/usr/local/Cellar/openssh/8.4p1_2/bin/ssh
/usr/local/Cellar/openssh/8.4p1_2/bin/ssh-add
/usr/local/Cellar/openssh/8.4p1_2/bin/ssh-agent
/usr/local/Cellar/openssh/8.4p1_2/bin/ssh-keygen
/usr/local/Cellar/openssh/8.4p1_2/bin/ssh-keyscan
/usr/local/Cellar/openssh/8.4p1_2/libexec/ (4 files)
/usr/local/Cellar/openssh/8.4p1_2/sbin/sshd
/usr/local/Cellar/openssh/8.4p1_2/share/man/ (15 files)

现在输入:

which sftp

结果是/usr/local/bin/sftp,这是/usr/local/Cellar/openssh/8.4p1_2/bin/sftp

然后尝试 Homebrew 版本的 SFTP 并享受它!

答案2

with-readline 是一个小程序,它允许 GNU Readline 库与任意程序一起使用,而无需重新编译这些程序。它对于改进简单的基于终端的程序的用户界面很有用,这些程序由于某种原因没有被修改为使用 Readline。关联

您可以安装 with-readline 来支持方向键和退格键。
但是 tab 仅在本地端受支持,您无法从远程端完成文件名。
安装如下:

brew install with-readline
echo 'alias sftp="with-readline sftp"' >> ~/.zshrc

答案3

好消息!sftp(OpenSSH)有一个构建配置选项,可以启用 editline(readline 历史记录)支持。我无法理解为什么任何理智的人会在没有这个选项的情况下构建它,因为它提供了您寻求的所有关键功能(向上箭头命令历史记录、本地和远程文件名的制表符完成等),没有任何警告。我在越狱的 iPad 上构建 OpenSSH 8.7p1 时启用了它,但我确信它在任何地方都同样有效。

相关内容