在 Bourne shell 脚本中获取 /etc/passwd 文件的锁



我有一个嵌入式系统,其中文件中/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( 就是一个例子。

最新更新