/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を使用し、それを達成する方法についてのアイデアを共有または持つことができると確信しています。ログインシェルと非ログインシェルの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と次のコメントなしの間のすべての行が含まれます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スクリプトがあります。三重引用符の間のコードテキストが次のようになっていることを確認してください。正確に確認しようとしているファイルでも同じ現象が発生します(この場合、コードがスクリプトに複数回表示される場合、実際には問題は発生しませんが)。

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書き込み場所はルートが所有しているため、以下を使用する必要があります。sudo python myscript.pyまたはsudo python3 myscript.py。スクリプトは、定義されたテキストブロックが/etc/bashrc含まれていることを確認し、含まれていない場合はファイルに追加します。/etc/profilesnippet

それは価値がありますか?

/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ハッシュを作成して変更されたことを確認することをお勧めします(単にコードがファイルのどこかにあるかどうかを確認するよりも確かに安定しています)。あなたが心配する「他の変化」の源は何であるか疑問に思います。

関連情報