如何在多台机器上保存和聚合 bash 历史?

Mah*_*hdi 4 linux ssh terminal virtualbox bash

我通常在作为虚拟机的多个远程主机上使用 SSH,并每 5-6 天重新创建一次。一旦我销毁并重新创建它们,我就会丢失这些 VM 中的所有 bash 历史记录。

有没有办法可以共享 bash 历史记录并在将来重新使用它?(类似于 Dropbox 但仅适用于 bash_history 文件)

Arg*_*uts 8

看一下Bashhub项目。这实际上正是您所要求的 - 一个用于 bash 历史记录的保管箱 - 但他们添加了工具来引用您所有机器的历史记录,假设它们可以访问互联网。将 shell 交互发送给第三方存在合理的担忧(例如雇主、隐私、处理敏感材料),但如果这些不是重要因素,这似乎是一个很好的解决方案。不幸的是,他们似乎没有开源代码的服务器组件,这对于缓解前面提到的问题会很好。

您可以使用许多不太复杂的技术,特别是如果每​​台机器都可以通过 ssh 访问彼此,或者至少每台机器都可以通过 ssh 与一个中央服务器通信。任何涉及多台机器同时更新公共历史文件(在单个链接位置或分布式更新中)的解决方案都会在一定程度上破坏 bash 的历史扩展功能 - 例如用 !! 可能会给你错误的命令。这些只是一些需要充实的想法:

  • 从服务器配置 NFS 共享,安装在每台机器上,从中符号链接您的 .bash_history 文件
  • 使用 bash PROMPT_COMMAND 功能将远程文件附加到您的最后一个命令(例如在 .bashrc 中,PROMPT_COMMAND="append_history" 然后添加该函数append_history () { ( ssh you@yourserver "echo !! >> ~/common_bash_history" ) & }。我将 ssh 命令放在子shell 中并将其置于后台以消除输入命令后的延迟。然后您必须定期执行将 common_bash_history 文件中的更改推送到每台机器(仅添加唯一条目)。

  • 在其中一台机器(“服务器”)上运行的定期 cron 作业从每台机器(“服务器”)中提取历史,创建一个主节点并将其推出。

在我的情况下,由于上述原因,Bashhub 不起作用。我一直在寻找一个“完美”的解决方案,但还没有找到——我暂时确定的是将我所有的历史从每台机器聚合到一个服务器上的主历史文件中。但我不会将聚合结果推回到每台机器的历史文件中;我为此使用了一个单独的文件,这让我可以添加诸如它来自哪台机器之类的内容,并且我为聚合文件(我用于“长期”历史记录)设置了新的搜索和完成功能并留下了 bashs 历史记录完整的扩展/完成(我用于“短期”历史)。如果 bashhub 使服务器软件和客户端软件都可用,那将是解决方案 (hack) 的一个高度完善的替代方案。