如何以编程方式维护 /etc/profile 和 /etc/bashrc 中的 umask

如何以编程方式维护 /etc/profile 和 /etc/bashrc 中的 umask

我正在寻找一种以编程方式在文件/etc/profile/etc/bashrc.他们有一个条目如下:

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

所以我想以编程方式检查if上面的第一条语句。如果找到,请检查并验证下一行是否为 umask(而不是注释),如果是,则将其设置回我的标准 umask(如果它偏离了它)。我意识到我可以复制整个文件,但不想打扰可能已进行的其他更改。我确信有人已经使用过 sed/awk/grep 并可以分享或者可能对如何实现这一目标有想法?我需要为登录 shell 和非登录 shell 维护一个 umask。它引用了这个https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/ assembly_managing-the-umask_configuring-basic-system-settings。谢谢。

答案1

我不明白为什么这有任何意义(参见评论),但你的任务可以这样完成:

sed -i".bak" '\_if \[ $UID -gt 199 ] && \[ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then_,/^[^#]*else/s/^\([^#]*umask\).*/\1 002/' /etc/profile /etc/bashrc

地址范围涵盖if子句和下一个 not-comment之间的所有行else。在此行中,不注释umask更改为002

请注意,您需要转义,[并且我确实选择下划线作为第一个地址的分隔符,以避免转义所有斜杠。

如果确实有人/某事正在更改这些文件,您可能会考虑对该行使用更灵活的模式if;否则if随着行的改变umask会破坏脚本。或许

sed -i".bak" '/if.*$UID *-gt *199/,/^[^#]*else/s/^\([^#]*umask\).*/\1 002/' /etc/profile /etc/bashrc

答案2

我正在寻找一种以编程方式在文件/etc/profile/etc/bashrc.他们有一个条目如下:

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

我想以编程方式检查if上面的第一条语句。如果找到,请检查并验证下一行是否为 umask(而不是注释),如果是,则将其设置回我的标准 umask(如果它偏离了它)。

为什么评论会出现在中间if?你的例子中没有。您可以通过以下方式大大简化此过程代码格式相同任何您需要检查其存在的地方。如果您能做到这一点,这里有一个 Python 脚本可以满足您的要求。确保三引号之间的代码文本是确切地同样的 at 出现在您要检查的文件中(尽管在这种情况下,如果代码在脚本中出现多次,它实际上不会导致任何问题):

snippet = '''
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi
'''
with open('/etc/profile','r+') as f:
    if snippet not in f.read():
        f.write(snippet)
with open('/etc/bashrc','r+') as f:
    if snippet not in f.read():
        f.write(snippet)

sudo因为写入位置是 root 拥有的,所以调用脚本时需要使用:sudo python myscript.py或者sudo python3 myscript.py。该脚本检查是否/etc/bashrc包含/etc/profile定义的文本块snippet,如果不包含,则将其附加到文件中。

这值得吗?

/etc/bashrc既然您表达了对和的内容/etc/profile可能会发生更改的担忧,我想知道您认为谁会进行这些更改。如果是系统本身,那么您想要使用的 umask 值无论如何都是默认值,所以我看不到系统将它们更改为其他值。另一方面,如果你有一个小鬼或其他sudoer人摆弄这些文件......

重要的是要认识到,告诉您代码文本已在脚本中的测试不会告诉您该代码是否会被执行。它是好简单做一些微妙的的变化将让你的代码不执行尽管这是在剧本里。

下面是代码仅在以下情况下执行false = true(即从不执行)的情况:

if false; then

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

fi

这个代码将代码包装在一个从未被调用的 HEREDOC 字符串中。

: <<'no-umask-4u'

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

no-umask-4u

这只是在代码执行后更改 umask(这里是一个非常简单的示例):

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
  umask 002
else
  umask 022
fi

umask 077

怎么办?在上述所有场景中,即使代码永远不会真正执行(或者在最后一个执行但随后被覆盖的情况下),对脚本中代码文本是否存在的任何编程测试都将通过。

我意识到我可以复制整个文件,但不想打扰可能已进行的其他更改。

生成文件的 sha1 哈希值并检查它是否发生更改可能值得考虑(这肯定比简单检查代码是否在文件中的某个位置更可靠)。我很好奇你所关心的“其他变化”的根源是什么。

相关内容