*快速解决方案*对于那些仅根据标题访问此页面而不想通读以下内容,或者认为以下内容不适用于您的情况的人,也许这会有所帮助。。。如果你想做的只是在启动时更改用户密码,并且正在使用Ubuntu 12.04或类似版本,以下是你所要做的。添加一个脚本以在启动时启动,其中包含以下内容:
printf "New PasswordnRepeat Passwordn" | passwd user
请记住,这必须以root身份运行,否则您将需要提供原始密码,如下所示:
printf "Original PasswordnNew PasswordnRepeat Passwordn" | passwd user
*开始原始问题*
我有一个第一个启动脚本,它通过从挂载的iso中进行一些配置和文件复制来设置VM。基本上会发生以下情况:
- 虚拟机首次启动
- /etc/rc.local用于将CD ISO安装到/media/cdrom并执行/media/ctrom/boot.sh
- boot.sh文件执行一些基本配置,将一些文件从CD复制到VM,并应使用当前密码更新用户密码
脚本的这一部分失败。密码未更新。我尝试过以下几种:
VAR="1234test6789"
echo -e "DEFAULTn$VARn$VAR" | passwd user
基本上,默认VM是由具有默认密码(default)的用户(例如jack)设置的。上面的脚本使用默认密码更新到存储在VAR中的新密码。登录时脚本可以自己工作,但我无法在启动时让它做同样的事。我确信有某种系统策略或某种东西可以阻止这种情况的发生。如果是这样的话,我需要一些变通办法。此VM正在进行大规模部署,并自动打包,并使用从CD ISO传递的自定义用户密码进行配置。
请帮忙。非常感谢。
*更新*
哦,我用的是Ubuntu 12.04
*更新*
我试过你的建议了。以下文件直接在rc.local中,即密码不更新。但是,脚本正在运行。我通过添加触摸线进行了测试。
touch /home/jack/test
VAR="1234test5678"
printf "P@ssw0rdn$VARn$VAR" | passwd jack
p@ssw0rd是示例默认VM密码
Jack是示例用户名。
*更新*
好的,我们认为这个问题可能与rc.local有关。所以rc.local在运行级别之前很早就被调用了,可能是这个问题的原因。
*更新*
这可能是个好消息。密码现在似乎在更新,但它更新到了与我在$VAR中设置的不同的内容。我认为这可能是在增加一些东西。这当然只是一个猜测。每次我运行测试时,脚本在启动时运行后,我就不能再使用它试图更新的用户名登录了。我知道这不是很多信息,但这是我目前所掌握的全部。有什么想法吗?为什么要在密码中添加其他内容?
*解决方案*
因此,有几个小问题,为什么我不能得到下面的建议工作。我不会在这里概述它们,因为它们无关紧要。最终的解决方案来自Graeme,并结合了我剧本的其他一些功能,我将在下面分享
默认VM引导
rc.local执行以下操作:
if [ -f /etc/program/tmp ]; then
mount -t iso9660 -o ro /dev/cdrom /media/cdrom
cd /media/cdrom
./boot.sh
fi
(tmp文件只是为了防止第一个引导脚本多次运行。boot.sh运行一个脚本后,它会删除该tmp文件。)
CDROM上的boot.sh运行(具有root权限)boot.sh将CDROM中的文件复制到/etc/programboot.sh还使用以下内容更新用户密码:
VAR="DEFAULT"
cp config "/etc/program/config"
printf "$VARn$VARn" | passwd user
rm -rf /etc/program/tmp
(VAR由连接到我们OVA部署解决方案的服务器的另一部分更改。基本上,用户可以为其VM获得自定义的随机密码,因此类似的用户无法访问彼此的VM)
还有一些测试要做,但我对这个问题得到解决相当满意。95%
编辑-因未输入原始密码而更新
与bash
不同,echo的sh
版本没有-e
选项。将echo
切换为printf
。此外,rc.local
脚本将具有root权限,因此不会提示输入原始密码。使用它将导致命令失败,因为"DEFAULT"将被用作新密码,并且确认将失败。这应该有效:
VAR="1234test6789"
printf "$VARn$VARn" | passwd user
Ubuntu在启动时使用dash
,这是sh
的替代品,并且比bash
轻得多。echo -e
是一种常见的抨击主义,在其他地方是行不通的。