备份您自己的脚本的最佳策略?

备份您自己的脚本的最佳策略?

---已经问过了在 unix.StackExchange 上,但已关闭(太主观)---

为清晰起见,重写。

  • 我想写一些我自己用的代码
  • 我希望能够备份它们
  • 我尚未建立备份程序——准备编写一个脚本。
  • 这将是我的第四个脚本,也是我第一次认真对待备份(所以要温柔)。

鉴于两个因素似乎需要权衡,最有效的策略是什么:

  1. 在几个选项中,/usr/local/bin被广泛认为是自定义脚本最有利的位置,(但并非唯一;请参阅下面的想法)

  2. /usr/local/bin充满了其他自动生成的文件(例如 Dropbox 等),我不想将它们带入备份,因此必须想办法进行过滤(对于我的技术水平来说这不是一项简单的任务,尽管我愿意学习)。

我是从“目录端”来解决这个问题(例如“不要使用那个目录,使用这个!”)还是从“备份脚本端”(例如,我可以使用tarcp或其他任何有效的过滤器来提取我的脚本文件来自人群/usr/local/bin)。

我找不到任何人在一个地方谈论这两件事(但是“备份”和“脚本”的结果被“备份脚本”淹没了,所以也许我错过了。)

谢谢 - 感谢您迄今为止的建设性回答。

PS-另请参阅早期版本在关闭之前,我已经在其他地方对这个问题进行了几次有用的答复。

答案1

您提到了两件事,我不认为它们是好的解决方案:

“由...制作”:

标准 Linux 文件属性包括所有者用户和组。我强烈建议您确保所有文件/usr/local/bin(或实际上几乎所有包含所有用户可访问内容的目录)都归root用户和组所有,并且只有所有者可写。这是一种安全措施,可以防止未经授权修改文件,这些修改可能会在以后由其他人或使用提升权限的人执行sudo

因此,由于所有这些脚本的所有者/usr/local/bin应该是root,我们不能用它来区分您想要备份的脚本。

“子目录”:

子目录中的可执行文件/usr/local/bin不会被系统接受为无需路径即可直接运行的命令。原因是,为此,可执行文件需要直接位于$PATH环境变量中列出的目录中。此处不会自动包含子目录,需要明确指定每个位置 - 再次强调,这是一项安全改进,旨在降低意外执行不受信任代码的风险。

尽管可以在所有必要的位置添加该子目录,但我会避免更改所有用户的$PATH(并且不要忘记,如果您希望在使用时可访问它,则/etc/sudoers配置secure_path也必须包含新目录sudo)。


那么,你可以做什么呢?以下是一些想法:

用户特定的 bin 目录:

如果您不需要这些脚本在系统范围内供所有用户使用,而只需要供您自己的帐户使用,只需将它们放入~/bin~即您的主目录)即可。此位置仅在您自己的用户上$PATH,而不属于任何其他用户。对于您的个人脚本,这应该是最简单的方法。

请记住,source ~/.profile如果您在当前会话期间刚刚创建了目录,则需要重新启动当前 shell 一次(关闭并重新打开终端窗口,键入或注销并重新登录)。这是因为只有在 shell 初始化时目录存在时才会添加目录。您以后不必再这样做。

保留你的脚本列表:

只需在某处有一个文本文件,列出您要备份的所有脚本/文件的路径。然后,您可以使用另一个脚本/命令(如下所示)处理此列表,将它们全部复制到您的备份目录中:

#!/bin/bash
backupdir=~/backup/scripts
listfile=~/backup/script-list.txt
while read line ; do
    cp -- "$line" "$backupdir"
done < "$listfile"

您只需保持列表文件(此处~/backup/script-list.txt)更新并格式正确即可。在这个简单版本中,您必须确保每行只包含一个要备份文件的绝对路径,没有前导或尾随空格,也没有空行。当然,可以改进脚本以处理此类情况,但这只是一个快速原型。

为您自己的脚本添加“签名”,并且仅备份包含该签名的脚本:

想象一下你添加到所有自己的脚本中的唯一字符串,例如在注释中。它可能看起来像*** CREATED BY BYTECOMMANDER ***这样,甚至可能更独特。然后,你可以制作一个备份脚本,扫描/usr/local/bin包含你的签名行的文件并仅复制这些文件,而不复制其他文件:

#!/bin/bash
backupdir=~/backup/scripts
signature="*** CREATED BY BYTECOMMANDER ***"
for scriptfile in /usr/local/bin/* ; do
    if grep -qF "$signature" "$scriptfile" ; then
        cp -- "$scriptfile" "$backupdir"
    fi
done

相关内容