概述:我正在尝试创建一个脚本,该脚本将获取计算机列表并使用新的根密码手动更新其/ 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线不起作用我知道为什么它不起作用但我根本不知道如何解决它,谢谢任何花时间看这个的人,我知道代码有点混乱,请原谅我。
答案 0 :(得分:0)
仅替换第一行:
"echo '$prod' > /etc/shadow.new; tail -n +1 /etc/shadow >> /etc/shadow.new; mv -f /etc/shadow.new /etc/shadow"
抱歉,我以前的错误论据是错误的:您脚本中的'$prod'
部分是正确的,并且展开正常。然而,$ prod包含许多用于正则表达式的保留字符。现在这个新版本只是创建一个新文件(替换第一行),然后移动/覆盖到目标文件。