当使用 sftp 从 Mac 传输到 Ubuntu 机器时,箭头键、退格键和制表符补全不起作用。具体来说,箭头键和退格键会产生字符序列,而制表符只会插入一个制表符。但是,当使用 sftp 从 Ubuntu 机器传输到 Mac 时,我没有遇到任何问题。我搞不清楚区别在哪里。我的目标是能够通过 sftp 传输到 Ubuntu 机器并使用箭头键、退格键和制表符补全。
壳:
我已经在两台机器上都尝试过了zsh
(bash
从 /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 时启用了它,但我确信它在任何地方都同样有效。