crontabで管理者ユーザーアカウント名を保持する変数をどのように宣言して使用しますか?

crontabで管理者ユーザーアカウント名を保持する変数をどのように宣言して使用しますか?

私はcrontabがroot不可知論的であることを望みます。つまり、文字通り管理ユーザーを指定したくありませんjim。これが私のcrontabにroot変数が導入された理由ですau

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

au=$(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')

5 */4 * * * /home/"${au}"/sync-w-oumaima.sh
* * * * * echo "$au">"/home/${au}/${au}.log"

残念ながら動作しません。/home/jim/jim.logcrontabで作成されていません。 crontabで管理者ユーザーアカウント名を保持する変数をどのように宣言して使用しますか?

答え1

このcrontab形式を使用すると、環境変数を定義できますが、置換は実行されません。あなたの例では、au変数は次のように定義されます。ひも $(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')

最も簡単な解決策は、crontabでユーザーを明示的に定義することです。

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

au=jim

5 */4 * * * /home/"${au}"/sync-w-oumaima.sh
* * * * * echo "$au">"/home/${au}/${au}.log"

au別の解決策は、変数を設定し、「実際の」コマンドを実行し、crontabでスクリプトを実行する簡単なスクリプトを作成することです。

#!/bin/bash
export au=$(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')
/home/"${au}"/sync-w-oumaima.sh

3番目の解決策は、シェル組み込みを使用してシェルに変数evalau内容を再解釈させることです。たとえば、次のようになります。

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

au=$(echo "$(head -n 1 /etc/doas.conf)"|sed 's/permit//;s/as//;s/root//;s/ //g')

5 */4 * * * eval /home/"${au}"/sync-w-oumaima.sh
* * * * * eval echo "$au" \> "/home/${au}/${au}.log"

しかし、あなたはそうしなければなりません。追加必要な脱出に注意してください(私は確かにそうではありませんでした)。

答え2

まず、(admin user)を見つけるようにコマンドを改善しますau

# Test with
sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf
# When this looks fine
au=$(sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf)

crontabでこれを使用できます

5 */4 * * * au=$(sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf) && /home/"${au}"/sync-w-oumaima.sh
* * * * * au=$(sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf) && echo "$au">"/home/${au}/${au}.log"

コマンドをスクロールする必要がある場合、コマンドが長すぎます。似たような線が多くなると汚れてしまいます。なぜ作らないでください/usr/local/bin/get_admin_user

# When this file is sourced (with a dot), the settings will remain available
export au=$(sed -nr '1s/permit (.*) as root.*/\1/p' /etc/doas.conf)

次に、このファイルをcrontabからインポートします。

SHELL=/bin/bash

PATH=/usr/bin:/bin:/usr/sbin:/sbin

get_au="/usr/local/bin/get_admin_user"

5 */4 * * * . ${get_au} && /home/"${au}"/sync-w-oumaima.sh
*  *  * * * . ${get_au} && echo "$au">"/home/${au}/${au}.log"

関連情報