bcvi - 通过“后备通道”运行 vi

如果你使用 SSH,你可能会发现 bcvi 很有用。本文尝试描述它是什么以及你为什么要使用它。让我们从它是什么开始:

bcvi 是一个命令行工具,它与 SSH 协同工作,以提供从你连接的服务器到你的工作站的“后备通道”。

你通常使用 SSH 是因为你想从你的工作站向服务器发送命令,但 bcvi 的工作方式相反 - 允许你将命令从服务器发送回你的工作站。为了理解为什么这很有用,让我们看几个例子。

我们的示例用户 Sally 将使用 SSH 从她的工作站 gecko 连接到服务器 pluto

示例网络

示例一

Sally 连接到服务器 pluto,并在 shell 提示符下,键入一个命令来编辑文件:

示例 1 截图

正如你从截图中看到的,Sally 键入了命令:

vi factory.rb

通过 bcvi 的魔力,结果是该文件在 Sally 的工作站上的 gvim 编辑器窗口中打开以进行编辑。 请注意,这不使用 X-forwarding。 GUI 编辑器进程在 Sally 的工作站上运行。 该文件使用 scp(通过 gvim 的 'netrw' 网络传输层)透明地复制到服务器 pluto 和从服务器 pluto 复制,但是启动编辑器的 shell 命令是在服务器 pluto 上输入的。

与在终端窗口中的远程服务器上运行 vim 相比,bcvi 为 Sally 提供了以下优势:

*你可能会争辩说 bcvi 本身需要在服务器上安装,但是 Sally 可以通过一个简单的命令(无需 root 访问权限)从她的工作站上执行此操作:

~$ bcvi --install pluto
Creating ~/bin directory on pluto
Copying bcvi to remote bin directory on pluto
Creating plugins directory on pluto
Copying plugin files to pluto
Added bcvi commands to /home/sally/.bashrc

示例一的工作原理

bcvi 实用程序不负责将文件复制到服务器“pluto”和从服务器“pluto”复制(gvim 已经可以做到这一点)。 相反,bcvi 用于建立从“pluto”到 Sally 的工作站的通信通道。 此后备通道用于发送一条消息,该消息触发启动 gvim 并加载指定的文件。

上面的示例假设:

gvim scp://pluto//home/sally/.bashrc

bcvi 组件

示例二

我们的朋友 Sally 登录到服务器“pluto”,并且正在尝试配置“Acme CRM”软件包。 她浏览文件系统并在文档目录中找到一个有用的文件:

示例 2 截图

在上面的最终命令中,Sally 使用了命令:

bcp manual.pdf

将 PDF 文件复制回她的工作站上的桌面。 然后,她只需双击桌面图标即可在她的 PDF 查看器中将其打开。

示例二的工作原理

第二个示例使用了与第一个示例相同的所有基础结构(listener 进程、shell 别名和端口转发),但添加了命令 bcp。 同样,这是一个 shell 别名,它调用 bcvi 将消息发送回 listener 进程。 唯一的区别是,这次消息指示 listener 进程运行此命令:

scp -q pluto:/usr/share/doc/acmecrm/manual.pdf /home/sally/Desktop

请注意,出于安全原因,不允许在 pluto 上运行的 bcvi 进程指定要在工作站上执行的命令。 它只是发送一个请求,其中包括主机名和文件名详细信息。 listener 进程确定它将接受哪些类型的请求以及它将运行哪些命令来处理它们。

示例三

Sally 现在正在设置 Acme CRM 软件包方面取得进展。 下一步是恢复数据库转储。 这将花费一些时间,并且 Sally 还有其他事情要做,因此她启动了此命令(实际上是两个用分号分隔的命令):

sally@pluto:~$ pg_restore -d acmecrm crm.pgdump; bnotify 'DB is restored!'

然后,Sally 最小化她的 shell/ssh 窗口,并继续进行其他重要工作。 几分钟后(当 restore 命令完成后),她的屏幕上会弹出一个桌面通知窗口:

示例 3 截图

示例三的工作原理

同样,此示例使用了与先前示例相同的所有后备通道基础结构,但是此示例也使用了 bcvi 插件。

bcvi 脚本本身仅使用核心 Perl 模块,但是与桌面通知 API 的接口需要 CPAN 中的 Desktop::Notify 模块。 它还需要一个小的“插件”模块来提供 listener 进程和其他模块之间的粘合。 插件在 App::BCVI::Plugins 中有更详细的描述。

安装 BCVI

bcvi 程序是一个独立的脚本,没有配套模块,也没有非核心依赖项。 要安装它,只需将 bin/bcvi 文件从 发行版 复制到你的搜索 PATH 中的目录即可。

或者,你可以使用标准的 CPAN 安装过程将脚本安装到你的站点 bin 目录:

perl Makefile.PL
make
make test
make install

“后备通道”协议需要一个客户端和一个服务器 - bcvi 脚本同时执行这两个角色。 服务器在你的工作站上运行,通常通过将命令添加到你的 X 会话启动来启动。 例如,在 Ubuntu/GNOME 下,你可以选择系统 ‣ 首选项 ‣ 启动应用程序并添加命令:bcvi --listener

Listener 设置截图

如果你从 shell 窗口手动启动 listener,你可能需要在命令后附加一个 & 符号,以将该命令置于后台运行。

连接到服务器时,你需要使用此命令包装 SSH 命令并添加所需的端口转发选项:

bcvi --wrap-ssh -- hostname

设置别名可能更方便,以便每次 SSH 连接都发生这种情况。 使用此命令将适当的别名添加到你的 bash 启动脚本:

bcvi --add-aliases

现在你已经设置了服务器并进行了 ssh 连接包装,你需要在你要 ssh 到的计算机上安装 bcvi:

bcvi --install _HOSTNAME_

至此,一切都应该可以正常工作了。 当你使用 SSH 登录到计算机时,你将可以使用许多 shell 别名:

vi 调用你工作站上的 gvim,并将你要编辑的文件的 scp://... URL 传递给它。 suvi 与上面相同,但使用 sudoedit,因此也可以编辑系统文件(需要 root 访问权限)。 bcp 将命名文件复制回你的工作站桌面。

插件可以安装其他别名(例如 App::BCVI::NotifyClient 插件安装的 bnotify 别名)。

调整你的 SSH 配置

为了充分利用 bcvi,你需要首先确保你已经整理好 SSH 的基础知识。

如果你每次连接到主机时都收到密码提示,则需要在尝试使用 bcvi 之前设置 安全的无密码登录

你无法将 bcvi 后备通道链接在一起,因此如果你需要 SSH 进入一个主机,然后从那里 SSH 到另一个主机,则你需要设置 透明的多跳 SSH

如果你使用慢速网络链接或连接到旧/慢速服务器,你可能会发现建立 SSH 连接需要几秒钟。 如果你每次在编辑器中保存文件时都发生这种情况,它会开始变得令人恼火。 你可以通过 重用你的 shell 会话正在使用的 SSH 连接 来避免连接开销。

与 SSHMenu 集成

SSHMenu 不使用 shell 别名来建立 SSH 连接,因此不会建立后备通道。 不要绝望 - bcvi 集成已直接内置到 SSHMenu 中。

如果 SSHMenu 在你的搜索 PATH 中检测到 bcvi,则会在“主机连接”对话框中添加一个额外的复选框:

SSHMenu/bcvi 截图

如果你已在目标服务器上安装了 bcvi,只需选中该框即可。

更多参考

有关从 CPAN 下载和安装 bcvi 的更多信息,请参见:App::BCVI

有关插件 API 的详细信息,请参见:App::BCVI::Plugins

源代码可在 http://github.com/grantm/bcvi 上找到。

Sally 令人敬畏的 Gecko 桌面壁纸由惊人的 Vladstudio 创建。

来自 Vladstudio 的桌面壁纸

网站版权所有 © 2007-2010 Grant McLean