我经常使用 SSH 和 SFTP 进行远程工作。后者基本上是一个通过 SSH 运行的文件复制协议,我想知道是否有其他原因导致这两个工具尚未集成,除了“到目前为止没有人愿意这样做”。对于“集成”,我的意思是说应该有某种方法可以在同一会话中将 SSH 模式更改为 SFTP 并返回。例如这样:
使用 SSH 登录:
$ ssh -i privkey [email protected]
Last login: Tue Nov 18 10:47:25 2014
-bash-4.1$ ls
cgi-bin error html icons manual
-bash-4.1$ cd html
-bash-4.1$ ls
index.html
-bash-4.1$ md5sum index.html
ad7c5e1ed76c2d4efd6613315b4d1411
我们想要替换index.html,因此应用一些魔术键盘组合来切换模式:
sftp> put index.html
使用另一个键盘组合返回 SSH 模式:
-bash-4.1$ md5sum index.html
dd208743fa38dd55ec21c1ed75fa035c
听起来非常实用,并且无需进行复制粘贴或打开两个会话。实现这一点是否需要对 SSH 协议进行重大更改?
答案1
向后兼容!
ftp 自 1971 年以来一直以某种形式存在。它于 1980 年成为标准 IP 文件传输协议。“sftp”只是一种 ftp 协议,它在通过网络传输数据时使用加密,但在其他方面与“ftp”协议相同。这使得数以百万计的现有脚本和过程能够以最小的更改利用改进的安全性。
ssh——安全 shell 协议旨在通过安全网络运行 shell 命令。 ssh 附带的各种网络实用程序命令均以熟悉的(对于 shell 脚本编写者而言)Bourne shell 命令为模型,因此“scp”语法大致基于 unix“cp”语法。
答案2
我想说,所有 FTP 会话机制、相反方向的单独数据和控制连接、当前目录等在 ssh 内实现都是困难且毫无意义的。复制可能只是重用连接,并且事实上它正在另一端运行 shell(但并不总是如此)。
为了快速复制文件,您可以重复使用现有的连接。假设您使用的是 OpenSSH。
建立正常的 ssh 连接,并且,当需要复制文件时,使用另一个终端窗口/tmux 窗口/tty 发出命令scp
。
如果您已ControlMaster
在 中进行设置(全局或针对特定主机组)~/.ssh/config
,scp
将重用您现有的连接,并且不会要求输入密码或浪费时间重新连接。
唯一的问题是,它scp
不会附加到您现有的会话并重用该 shell 的当前目录。但这并不总是可能的:假设您的远程 shell 已经在运行不同的进程(tmux
、mc
、tail -f
等)。所以你必须完整地写:scp index.html hemote.host:path/to/www/
。通常从远程窗口复制路径并不难。
不幸的是,~Ctrl+Zor~&不适用于多路复用会话,因此,如果您只有一个旧的 VT-220,则应该事先运行tmux
或screen
。
同样适用于rsync
或sshfs
什至sftp
支持不同的发送数据模型,但也可以共享连接。