私は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.log
crontabで作成されていません。 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番目の解決策は、シェル組み込みを使用してシェルに変数eval
の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 * * * 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"