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