Bcvi - 通过“后备通道”运行 vi (2010)
bcvi - 通过“后备通道”运行 vi
如果你使用 SSH,你可能会发现 bcvi
很有用。本文尝试描述它是什么以及你为什么要使用它。让我们从它是什么开始:
bcvi
是一个命令行工具,它与 SSH 协同工作,以提供从你连接的服务器到你的工作站的“后备通道”。
你通常使用 SSH 是因为你想从你的工作站向服务器发送命令,但 bcvi
的工作方式相反 - 允许你将命令从服务器发送回你的工作站。为了理解为什么这很有用,让我们看几个例子。
我们的示例用户 Sally 将使用 SSH 从她的工作站 gecko 连接到服务器 pluto:
示例一
Sally 连接到服务器 pluto,并在 shell 提示符下,键入一个命令来编辑文件:
正如你从截图中看到的,Sally 键入了命令:
vi factory.rb
通过 bcvi
的魔力,结果是该文件在 Sally 的工作站上的 gvim
编辑器窗口中打开以进行编辑。 请注意,这不使用 X-forwarding。 GUI 编辑器进程在 Sally 的工作站上运行。 该文件使用 scp(通过 gvim 的 'netrw' 网络传输层)透明地复制到服务器 pluto 和从服务器 pluto 复制,但是启动编辑器的 shell 命令是在服务器 pluto 上输入的。
与在终端窗口中的远程服务器上运行 vim 相比,bcvi
为 Sally 提供了以下优势:
- Sally 工作站上的 gvim 具有她所有首选的键映射、自定义宏、插件和脚本。
- gvim 是一个 GUI 应用程序,可以响应鼠标输入以进行滚动、选择文本、复制和粘贴。
- gvim 知道 Sally 何时粘贴,因此它可以自动禁用 autoindent,并避免在终端窗口中粘贴到 vim 中时经常看到的令人恐惧的阶梯效应。
- 由于 gvim 在本地运行(而不是通过 X-forwarding 运行),因此应用程序加载速度很快,并且可以响应用户输入。
- 无需在服务器上安装 GUI 应用程序或库。*
*你可能会争辩说 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 并加载指定的文件。
上面的示例假设:
bcvi
'listener' 进程已由 Sally 的 X 会话启动脚本启动。- 用于连接到“pluto”的
ssh
命令实际上是一个 shell 别名,该别名设置了环境并使用额外的参数调用实际的 ssh 命令以进行端口转发“后备通道”。 - Sally 在“pluto”上的登录脚本调用
bcvi
以解压缩环境并设置所需的身份验证密钥。 - 用于在 pluto 上编辑文件的
vi
命令实际上是一个 shell 别名,该别名调用bcvi
以通过后备通道将消息传递到 Sally 工作站上的 listener 进程。 - listener 进程解压缩消息以提取启动此命令所需的主机名和文件名信息:
gvim scp://pluto//home/sally/.bashrc
示例二
我们的朋友 Sally 登录到服务器“pluto”,并且正在尝试配置“Acme CRM”软件包。 她浏览文件系统并在文档目录中找到一个有用的文件:
在上面的最终命令中,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 命令完成后),她的屏幕上会弹出一个桌面通知窗口:
示例三的工作原理
同样,此示例使用了与先前示例相同的所有后备通道基础结构,但是此示例也使用了 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
:
如果你从 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
,则会在“主机连接”对话框中添加一个额外的复选框:
如果你已在目标服务器上安装了 bcvi
,只需选中该框即可。
更多参考
有关从 CPAN 下载和安装 bcvi
的更多信息,请参见:App::BCVI。
有关插件 API 的详细信息,请参见:App::BCVI::Plugins。
源代码可在 http://github.com/grantm/bcvi 上找到。
Sally 令人敬畏的 Gecko 桌面壁纸由惊人的 Vladstudio 创建。
网站版权所有 © 2007-2010 Grant McLean