【发布时间】:2018-11-06 08:03:29
【问题描述】:
我发现了很多很接近的问题,但不完全适合我的用例,所以不得不打开一个新问题。
猜一个系统的密码由多个配置文件中的所有小写和大写字母、数字和特殊字符(a-z、A-Z、0-9、#)组成(主上的 Web 应用程序使用相同的密码)域、其子域和所有相关数据库)。带有密码的此类文件的示例是:
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'database_name',
'username' => 'datbase_user',
'password' => 'yv[48k2)KMGx{g1b',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'collation' => 'utf8mb4_general_ci',
'charset' => 'utf8mb4',
'prefix' => '',
),
),
);
我正在尝试编写一个 bash 代码,它采用自动生成的新密码(使用相同的算法 - 所有小写和大写字母、数字和特殊字符),在各自父目录的主目录中找到所有出现的旧密码域及其子域,并替换为新密码。以下单线工作正常:
grep -rlF "$old_pass" /path/to/directory | xargs sed -i "s/$old_pass/$new_pass/g"
仅由字母和数字组成的密码(例如qVYYgB5bRxUYpHg)。然而,虽然grep 部分工作正常,但只要系统向生成的密码(例如aN#zDU>lve15Uwqn)添加特殊字符,sed 部分就会失败,给出:
sed -i "s/$old_pass/$new_pass/g" password.php
sed: -e expression #1, char 37: unterminated `s' command
替换所有出现的现有密码的最佳方法是什么?该密码由存储在多个文件的不同变量中的所有字母、数字和特殊字符组成?
【问题讨论】:
-
您现在发布的是一个非常不同的问题,对迄今为止发布的任何答案都有非常不同的正确解决方案(提示:您不会搜索原始密码)。我不想再去,但希望其他人会。祝你好运。
-
对不起,Ed,我一开始以为问题只是
sed部分所以决定集中注意力,但是当人们开始建议操作给定文件时,我不得不解释我不' t 有特定的文件,而是 grep 搜索的输出。 -
配置文件是否有一个通用名称(例如
config.txt)或通用后缀(例如foo,cfg、bar.cfg等)或任何其他通过名称区分它们的方式其他文件? -
最终用户的应用程序可以有任何类型的文件,所以很遗憾我不能依赖文件名中的任何模式,而是使用 grep 搜索然后操作文件。
-
不过,这是一种有缺陷的方法 - 您依赖的旧密码字符串不是某个较长字符串的一部分,也不存在于任何其他文件中。这样做可能会严重损坏文件。您至少应该测试
'分隔符和单词password。我至少会搜索'password' => 'yv[48k2)KMGx{g1b',,而不仅仅是yv[48k2)KMGx{g1b,或者我可能实际上正在搜索'password' => '[^']+',(也许$databases = array以确保我使用正确的文件类型)除非实际的旧密码是必需的。
标签: regex awk sed special-characters