暗号化を更新できるcronファイルのリストがたくさんあります。各ファイルにはcronスケジュールがあり、時間と分を真夜中以降の時間に置き換えようとします。これを行うには、bashスクリプトを使用し、sedを使用して時間と分を更新しようとしています。私の人生では、私は台無しにされたsed代替品を見つけることができません。多くのフォーラムを検索してみましたが、設定を正しく設定できませんでした。これが私が得るものです:
for FILE in $(find ./renew -type f -name "letsen*")
do
# This will be the new min / hour
TIMESET="$(($RANDOM % 59 + 0)) $(($RANDOM % 10 + 2))";
sed -e 's/[0-9]+\W[0-9]+})/$TIMESET/' $FILE;
done
以下は LetsEncrypt ファイルの例です。
33 19 * * 5 root /bin/bash /home/forge/.letsencrypt-renew/711959 > /home/forge/.letsencrypt-renew/711959.out$
私は何を見逃していますか?どんな助けをありがとう!
修正する
Edgar Magalonに感謝します。これが私に役立つ解決策です。
for FILE in ./renew/letsen*
do
[[ -f $FILE && ! -L $FILE ]] && {
TIMESET="$(($RANDOM % 59 + 0)) $(($RANDOM % 10 + 2))";
# I think it's best to do a backup like what was suggested.
sed -i'.bak' -Ee "s/[0-9]+[0-9]+/$TIMESET/" "$FILE";
}
done
echo "Done! Have a great day~!";
答え1
繰り返しファイルのリストを使用しないでくださいfind
。バラより検索結果を繰り返すのはなぜ悪い習慣ですか?
単純なfor
ループを使用して、名前でファイルのリストを繰り返すことができますletsen*
。-type f
を使ってコピーできます[[ -f $FILE ]]
。
コマンドについてはsed
一重引用符を使用しているように見えますが'
、時と分をthenに置き換えるには$TIMESET
二重引用符を使用する必要があります"
。また、これを参照してください:Bashの一重引用符と二重引用符の違い。使用するには-E
オプションを使用する必要があります。sed
拡張正規表現。
})
なぜここにいるのかわかりません/[0-9]+\W[0-9]+})/
。そうする必要はないと思います。私が正しく覚えているなら、この値を33 19
に保存された値に置き換えたいからです$TIMESET
。
前述のように、この値を変更しようとすると、コードは次のようになります。
for FILE in ./renew/letsen*
do
[[ -f $FILE ]] && {
# This will be the new min / hour
TIMESET="$(($RANDOM % 59 + 0)) $(($RANDOM % 10 + 2))";
sed -Ee "s/[0-9]+\W[0-9]+/$TIMESET/" "$FILE"
#Or I guess you can remove '\W' and use a single space.
#I'm not sure if cron files have always a space between those numbers.
#If so, then you could use this:
sed -Ee "s/[0-9]+ [0-9]+/$TIMESET/" "$FILE"
}
done
各ファイルを編集したい場合所定の位置に-i
コマンドにオプションを追加する必要がありますsed
。
#If you want to backup every file:
sed -i'.bak' -Ee "s/[0-9]+\W[0-9]+/$TIMESET/" "$FILE"
#Without backup
sed -i -Ee "s/[0-9]+\W[0-9]+/$TIMESET/" "$FILE"