1

* 快速解决方案 * 对于那些仅根据标题访问此页面并且不想通读以下所有内容或认为以下所有内容不适用于您的情况的人,也许这会有所帮助...如果您正在寻找要做的是在启动时更改用户密码并使用 Ubuntu 12.04 或类似版本,这就是您所要做的。添加一个脚本以在启动时启动,其中包含以下内容:

printf "New Password\nRepeat Password\n" | passwd user

请记住,这必须以 root 身份运行,否则您将需要提供原始密码,如下所示:

printf "Original Password\nNew Password\nRepeat Password\n" | passwd user

*开始原始问题*

我有一个第一个启动脚本,它通过从已安装的 iso 执行一些配置和文件副本来设置 VM。基本上会发生以下情况:

  1. VM 首次启动。
  2. /etc/rc.local 用于将 CD ISO 挂载到 /media/cdrom 并执行 /media/cdrom/boot.sh
  3. boot.sh 文件进行一些基本配置,将一些文件从 CD 复制到 VM,并且应该使用当前密码更新用户密码。

这部分脚本失败。密码未更新。我尝试了以下方法:

VAR="1234test6789"
echo -e "DEFAULT\n$VAR\n$VAR" | passwd user

基本上,默认 VM 是使用具有默认密码 (DEFAULT) 的用户(例如 jack)设置的。上面的脚本使用默认密码更新存储在 VAR 中的新密码。该脚本在登录时自行运行,但我无法让它在启动时执行相同的操作。我确信有某种系统策略或阻止这种情况的东西。如果是这样,我需要一些解决方法。此 VM 正在大规模部署,并自动打包并使用从 CD ISO 传递的自定义用户密码进行配置。

请帮忙。谢谢!

* 更新 *

哦,我使用的是 Ubuntu 12.04

* 更新 *

我试过你的建议。以下文件直接在rc.local 即密码不更新。但是该脚本正在运行。我通过添加触摸线进行了测试。

touch /home/jack/test
VAR="1234test5678"
printf "P@ssw0rd\n$VAR\n$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/program boot.sh 还使用以下内容更新用户密码:

VAR="DEFAULT"
cp config "/etc/program/config"
printf "$VAR\n$VAR\n" | passwd user
rm -rf /etc/program/tmp

(VAR 被连接到我们的 OVA 部署解决方案的服务器的另一部分更改。基本上,用户为其 VM 获得了一个自定义的、随机的密码,因此类似的用户无法访问彼此的 VM)

仍有一些测试要做,但我对这个问题得到解决感到相当满意。95%

4

1 回答 1

0

编辑- 更新为不输入原始密码

echo的sh版本没有-e选项,不像bash. 切换echoprintf. 此外,该rc.local脚本将具有 root 权限,因此不会提示输入原始密码。使用它会导致命令失败,因为“DEFAULT”将被视为新密码并且确认将失败。这应该有效:

VAR="1234test6789"
printf "$VAR\n$VAR\n" | passwd user

Ubuntudash在启动时使用,它shbash. echo -e是一种常见的 bashism,在其他地方不起作用。

于 2014-01-13T16:36:04.987 回答