linux 无法替换文件内容

vxf3dgd4  于 2023-06-29  发布在  Linux
关注(0)|答案(2)|浏览(167)

我试图在另一个shell脚本中使用perl命令替换文件的内容:
文件名:INFA.param
内容:

$ParamUser=SOMEUSERNAME
$ParamPswd=SOMEPASSWORD
$$StartTime=2021-06-26 08:31:51:1195079
$$EndTime=2021-06-26 09:31:51:1195079

当我在另一个shell脚本“www.example.com”中打开上述文件pp.sh时

cat INFA.param > temp.param
. ./temp.param
pmcmdpassword=$(pmcmd $password -e CRYPTDATA)
perl -pe -e "s#ParamPswd=\Q$ParamPswd\E#ParamPswd=$pmcmdpassword#g" INFA.param

我得到了一些错误:

=SOMEUSERNAME: not found
=SOMEPASSWORD: not found
31850942StartTime=2021-06-26 08:31:51:1195079: not found
31850942EndTime=2021-06-26 09:31:51:1195079: not found

你能建议我如何更换密码吗?

frebpwbc

frebpwbc1#

只有当文件被写入为有效的shell源代码时,才可以安全地使用.source。你这里的文件不是这样的:shell赋值不以$开头。
如果您试图通过重新加密来修改现有的密码,这就是为什么您的代码试图将原始文件读入shell解释器,那么您可能需要:

#!/usr/bin/env bash
#              ^^^^- NOT sh, ONLY bash

declare -A variables=( )
while IFS='=' read -r key value; do
  variables[$key]=$value
done < INFA.param

oldPassword=${variables['$ParamPswd']}
newPassword=$(pmcmd "$oldPassword" -e CRYPTDATA)

in="$oldPassword" out="$newPassword" \
  perl -pi -e 's/\Q$ENV{"in"}/$ENV{"out"}/g' INFA.param

如果您输入新密码,则会更容易;那么你根本就不需要读取原始文件:

newPassword=$(pmcmd "${password?Password undefined}" -e CRYPTDATA)

out="$newPassword" \
  perl -pi -e 's/^[$]ParamPswd=.*$/$ENV{"out"}/g' INFA.param
kzmpq1sx

kzmpq1sx2#

您正在执行以下bash脚本:

$ParamUser=SOMEUSERNAME
$ParamPswd=SOMEPASSWORD
$$StartTime=2021-06-26 08:31:51:1195079
$$EndTime=2021-06-26 09:31:51:1195079

与Perl不同,bash只使用$来扩展变量。例如:

a='some text'
echo "$a"

在bash中给出:

some text

当脚本启动时,bash变量ParamUser为空,因此$ParamUser=SOMEUSERNAME行将扩展为=SOMEUSERNAME。这不是一个有效的命令,因此bash会抱怨

=SOMEUSERNAME: not found

对于bash

$$StartTime=2021-06-26 08:31:51:1195079

包含多个不同的问题,其中间距。此外,$$扩展到当前进程的PID,显然是31850942。
所以,解决办法是

ParamUser=$(sed -n 's/ParamUser=//p' INFA.param)

(same其余的)
请注意,行

pmcmdpassword=$(pmcmd $password -e CRYPTDATA)

使用了一个变量password,该变量未在问题的脚本部分中设置。

相关问题