我通常通过 SSH 连接多个远程主机(即虚拟机)并每 5-6 天重新创建一次。一旦我销毁并重新创建这些虚拟机,我就会丢失其中的所有 bash 历史记录。
有没有办法可以共享 bash 历史记录并在将来重新使用它?(类似 Dropbox,但仅适用于 bash_history 文件)
答案1
查看项目巴什胡。它实际上就是您所要求的 - 一个用于存储 bash 历史记录的 Dropbox - 但他们添加了工具来引用您所有机器的历史记录,假设它们可以访问互联网。将您的 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 提供服务器软件以及客户端软件,那么它将是我拼凑的解决方案(黑客)的高度完善的替代方案。