我有一个嵌入式系统,其中文件中/etc/passwd
用户管理通常使用Bourne shell脚本自动完成。但是,有时/etc/passwd
文件可能会由root
用户或passwd
实用程序使用文本编辑器编辑。有没有办法对 Bourne shell 脚本进行编程,使其在执行过程中锁定/etc/passwd
文件,以便其他程序当时无法编辑该文件?此外,此脚本应检测/etc/passwd
文件是否未被其他进程打开。我可以使用来自Wooledge维基的以下解决方案:
# locking example -- CORRECT
# Bourne
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then # directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
# continue script
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
exit 0
fi
但是,这只能确保此脚本的两个实例不会同时运行。我还有一个可用的 BusyBox lock
,它的行为类似于 flock
,但同样,据我所知,我无法保护编辑/etc/passwd
文件的其他进程。
vipw
命令可能会为您提供此功能,您可以使用EDITOR
环境名称自定义编辑器。
有关详细信息,请参阅man vipw
。
有没有办法对 Bourne shell 脚本进行编程,使其在执行过程中锁定/etc/passwd 文件,以便其他程序当时无法编辑该文件?
这称为强制文件锁定,答案可能是否定的。 在 Linux 中,挂载文件系统时需要 mand
选项。 我猜这在您的环境中是不可能的,但如果这是一个选项(可以这么说(,请查看您最喜欢的资源,了解如何从那里继续。
这不是您需要的 shell 脚本功能。 对于一个进程,防止另一个进程打开文件需要内核支持。 Unix程序传统上使用咨询锁,或者以其他方式合作。 vipw(8( 就是一个例子。