---已经问过了在 unix.StackExchange 上,但已关闭(太主观)---
为清晰起见,重写。
- 我想写一些我自己用的代码
- 我希望能够备份它们
- 我尚未建立备份程序——准备编写一个脚本。
- 这将是我的第四个脚本,也是我第一次认真对待备份(所以要温柔)。
鉴于两个因素似乎需要权衡,最有效的策略是什么:
在几个选项中,
/usr/local/bin
被广泛认为是自定义脚本最有利的位置,(但并非唯一;请参阅下面的想法)/usr/local/bin
充满了其他自动生成的文件(例如 Dropbox 等),我不想将它们带入备份,因此必须想办法进行过滤(对于我的技术水平来说这不是一项简单的任务,尽管我愿意学习)。
我是从“目录端”来解决这个问题(例如“不要使用那个目录,使用这个!”)还是从“备份脚本端”(例如,我可以使用tar
或cp
或其他任何有效的过滤器来提取我的脚本文件来自人群/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