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