bash在使用变量时用另一行覆盖文本文件中的单行

时间:2014-11-05 01:58:54

标签: bash ssh sed

概述:我正在尝试创建一个脚本,该脚本将获取计算机列表并使用新的根密码手动更新其/ etc / shadow文件。我知道这不是最好的方法,但我的老板希望这个过程自动化。我们正在使用名为puppet的应用程序进行90%的更新,但有些机器未通过更新或无法安装木偶,因此这种狡猾的修复。 (对不起任何愚蠢的错误,我的第3周只使用任何unix产品,我一生都是Windows管理员)

问题: 我需要在PC上更新/ etc / shadow文件,但只更改root用户(并非所有系统都有相同的用户,我不想在此过程中删除任何这些用户)我已经能够通过ssh提取第1行中的当前用户,然后检查该用户是否确实是root用户但是我被困在然后更新新机器上的/ etc / shadow文件,因为我的老板已经要求以下标准发生。

我在脚本中无法进行任何真实的用户交互,因此无需手动输入新的passwd。 我不允许以明文形式(在脚本内部或在另一个文件中)以任何方式显示新的passwd

好的希望在代码上有足够的信息。

root=user

unknown='unknown.txt'

filelines=`cat $unknown`

prod='new-shadow'

ohf='option-one-holding-file'

pel=prod-errorlog


for line in $filelines ; do

echo "Attempting to fix $line please wait"

ssh -oBatchMode=yes -l $user $line "awk '{if (NR==1) print \$0}' /etc/shadow" >> $ohf         

if grep -q "root:" $ohf ; then

echo "root user located updating to produtcion password"

# ** This is the line that doesn't work **
ssh -oBatchMode=yes -l $user $line "sed -i '1s/.*/$prod/' /etc/shadow"

else    

echo "unable to find root user this will require a manual fix this server will be listed in 
the prod-errorlog file"

echo "$line" >> $pel

fi      

done 

粗线的sed线不起作用我知道为什么它不起作用但我根本不知道如何解决它,谢谢任何花时间看这个的人,我知道代码有点混乱,请原谅我。

1 个答案:

答案 0 :(得分:0)

仅替换第一行:

"echo '$prod' > /etc/shadow.new;  tail -n +1 /etc/shadow >> /etc/shadow.new; mv -f /etc/shadow.new /etc/shadow"

抱歉,我以前的错误论据是错误的:您脚本中的'$prod'部分是正确的,并且展开正常。然而,$ prod包含许多用于正则表达式的保留字符。现在这个新版本只是创建一个新文件(替换第一行),然后移动/覆盖到目标文件。