crontab에서 관리자 사용자 계정 이름을 보유하는 변수를 어떻게 선언하고 사용합니까?

crontab에서 관리자 사용자 계정 이름을 보유하는 변수를 어떻게 선언하고 사용합니까?

나는 crontab이 root불가지론적이기를 원합니다. 즉, 문자 그대로 admin 사용자를 지정하고 싶지 않습니다 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

세 번째 해결책은 쉘 내장을 사용하여 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"

관련 정보