alibek Posted June 18, 2021 Posted June 18, 2021 Сделал небольшой "отладчик" для задач планировщика; скрипт, который вручную запускает задачи из планировщика максимально близко к тому, как будет в действительности. Скрытый текст #!/bin/bash if [ -z "$1" -o -z "$2" ]; then echo "Usage: $0 - <search> : for use system wide crontab (/etc/crontab)" echo " or $0 <crontab> <search> : for use pluggable crontab (/etc/cron.d/<crontab>)" echo "Immediate start cron job for command with specified <search> string" exit fi if [ "$1" = "-" ]; then FILE=/etc/crontab elif [ -f /etc/cron.d/$1 ]; then FILE=/etc/cron.d/$1 fi STR="$2" if [ -z "$FILE" ]; then echo "crontab $1 not found in /etc/cron.d/" exit fi N=`grep "$STR" "$FILE" | wc -l` if [ $N -eq 0 ]; then echo "Search string [$STR] not found in $FILE" exit elif [ $N -gt 1 ]; then echo "Search string [$STR] non unique in $FILE" exit fi STR=`grep "$STR" "$FILE"` read N H D M W USR CMD <<< "$STR" echo "Job usr: $USR" echo "Job cmd: $CMD" STR="/tmp/run_as_cron.sh" echo "#!/bin/bash" > "$STR" grep "^[^[:space:]]\+=" "$FILE" >> "$STR" echo "$CMD" >> "$STR" sudo -u $USR env -i - $SHELL -- "$STR" $* rm -f "$STR" Запускается так: run-as-cron maint purge_logs.sh Здесь maint означает, что задание находится в /etc/cron.d/maint. А purge_logs.sh это просто строка, которая ищется в указанном файле; и если эта строка единственная, то скрипт запустит соответствующее задание. Скрипт работает, но не нравится пара моментов. Во-первых, используется sudo, соответственно пользователю должно быть разрешено sudo и требуется интерактивный ввод пароля. И даже идей нет, как это обойти. Во-вторых, используются временный файл. Хотелось бы обойтись без файлов, но никак не выходит (ключ /c в разных шеллах работает по разному). Тут я пробовал по всякому, в том числе разделять строку по символу ;, выделять в подстроке первое слово и проверять, является ли оно внешней программой. Но слишком сложно и ненадежно. Вставить ник Quote
alibek Posted June 19, 2021 Author Posted June 19, 2021 Принципиально это мало что меняет. Я думал, что может быть можно с флагами setuid это сделать, но что-то не выходит. Поэтому сделал проще — поместил скрипт в /usr/sbin и сказал, что его может использовать только root (либо пользователь через sudo). Тот может вызывать sudo без пароля и все работает. С временным файлом вроде бы так же получилось решить вопрос. Нужно во-первых вручную составить список переменных окружения (для передачи в env), а во-вторых экранировать некоторые символы перед вызовом bash /c. Правда переносимость между разными шеллами так же отсутствует, ну тут уж ничего не поделать. Я все равно во временном файле указываю bash. Вставить ник Quote
Ivan_83 Posted June 21, 2021 Posted June 21, 2021 Как же вы достали везде пихать bash вместо sh. Вставить ник Quote
alibek Posted June 21, 2021 Author Posted June 21, 2021 Ну так sh многое не умеет, особенно по части работы с подстроками и массивами. Вставить ник Quote
vop Posted June 21, 2021 Posted June 21, 2021 2 hours ago, Ivan_83 said: Как же вы достали везде пихать bash вместо sh. FreeBSD научила меня писать: #!/usr/bin/env bash :) Вставить ник Quote
alibek Posted June 21, 2021 Author Posted June 21, 2021 FreeBSD я вообще стараюсь трогать пореже. Остался один сервер на 8.2, через пару недель поставлю на нем какой-нибудь CentOS и вздохну свободно. FreeBSD подходит для статичных необслуживаемых систем, где один раз настроил и забыл на несколько лет, пока сервис или железо не помрет. А если нужно обслуживание, обновление или модернизация, то линукс удобнее. Вставить ник Quote
edo Posted June 22, 2021 Posted June 22, 2021 7 часов назад, alibek сказал: Ну так sh многое не умеет, особенно по части работы с подстроками и массивами. моё ИМХО: если вам такое понадобилось, то берите нормальный язык программирования по вкусу, а не шелл. Вставить ник Quote
ixi Posted June 22, 2021 Posted June 22, 2021 Во временном файле нет ничего плохого, если вы не запускаете скрипт по 100 раз в секунду. Но лучше использовать mktemp на всякий пожарный В конфиге sudo можно включить NOPASSWD, но в вашей реализации это будет большой дырой в безопасности. Вставить ник Quote
alibek Posted June 22, 2021 Author Posted June 22, 2021 1 минуту назад, ixi сказал: Во временном файле нет ничего плохого Кроме того, что нужен rw-доступ к файловой системе. Подобные скрипты иногда запускаются на всяких коробочках, у которых вместо диска NAND или обычная флешка; в этом случае чем меньше трогать память, тем лучше. 4 минуты назад, ixi сказал: это будет большой дырой в безопасности Я это и имел ввиду в самом первом сообщении (что нет идей, как обойти запрос пароля; отключения запроса пароля будет куда хуже). Сейчас остановился на том, что скрипт перенес в sbin, соответственно его должен запускать не рядовой пользователь, а для root пароль на sudo не нужен. Вставить ник Quote
ixi Posted June 22, 2021 Posted June 22, 2021 23 минуты назад, alibek сказал: , у которых вместо диска NAND или обычная флешка tmpfs? Вставить ник Quote
alibek Posted June 22, 2021 Author Posted June 22, 2021 Проще сразу не использовать временные файлы, чем искать подходящее для них место. Сейчас под рукой нет железки, чтобы перепроверить, но на EdgeRouter (Vyatta) по-моему /tmp находится на флешке. И не уверен, есть ли там /dev/shm (там не самое свежее ядро). Вставить ник Quote
Ivan_83 Posted June 22, 2021 Posted June 22, 2021 19 часов назад, alibek сказал: Ну так sh многое не умеет, особенно по части работы с подстроками и массивами. shell умеет много всего при прямых руках и он работает ВЕЗДЕ, в отличии от всратого баша. 16 часов назад, alibek сказал: FreeBSD я вообще стараюсь трогать пореже. А причём тут вообще фря!? Думаете мало linux based и не только linux/bsd based систем где баша нет? Из того с чем я работаю: Android, OpenWRT без баша совсем. 16 часов назад, alibek сказал: FreeBSD подходит для статичных необслуживаемых систем, где один раз настроил и забыл на несколько лет, пока сервис или железо не помрет. У меня дома всё на фре, выполнить пару конманд в терминале раз в неделю чтобы обновить порты и вообще всю систему - не составляет труда. 16 часов назад, alibek сказал: А если нужно обслуживание, обновление или модернизация, то линукс удобнее. Так и пишите что вы его лучше знаете и что для вас там уже кто то другой всё автоматизировал. И давайте не будем разводить срач linux vs bsd, претензия была к bash как не переносимой хрени. 5 часов назад, alibek сказал: Кроме того, что нужен rw-доступ к файловой системе. /tmp Вставить ник Quote
alibek Posted June 22, 2021 Author Posted June 22, 2021 1 час назад, Ivan_83 сказал: shell умеет много всего при прямых руках Но вот обработка строк, вложенные команды и подпроцессы — не его сильное место. Вставить ник Quote
pppoetest Posted June 22, 2021 Posted June 22, 2021 25 минут назад, alibek сказал: обработка строк, вложенные команды и подпроцессы perl? Вставить ник Quote
Ivan_83 Posted June 22, 2021 Posted June 22, 2021 1 час назад, alibek сказал: Но вот обработка строк, вложенные команды и подпроцессы — не его сильное место. 1. Всё необходимое можно реализовать, может не так просто и лаконично как в баше, но и не на порядки сложнее. http://www.netlab.linkpc.net/download/software/entware/opt/bin/app_disabler.sh 2. У вас довольно простой скрипт. Вставить ник Quote
RN3DCX Posted June 22, 2021 Posted June 22, 2021 9 часов назад, Ivan_83 сказал: Так и пишите что вы его лучше знаете и что для вас там уже кто то другой всё автоматизировал. @Ivan_83 +1 к карме, за данный пост. Конечно факт, что в 2021 фряха стала уступать linux'о подобным OS. Но закат еще не близок! Кстати, в других проектах не встречал support на русском языке =) Вставить ник Quote
Ivan_83 Posted June 23, 2021 Posted June 23, 2021 15 часов назад, RN3DCX сказал: Конечно факт, что в 2021 фряха стала уступать linux'о подобным OS. Но закат еще не близок! По дровам у нас хуже, да. Но может статься что скоро у нас почти любы дрова линукса будут заводится после простого копирования и сборки исходников. По каким то плюшкам - ну может, из критичного для меня почти всё появилось и работает, на десктопе с каждым годом всё комфортнее и комфортнее жить. На сервере у меня и не было никакого дискомфорта с фрёй, прямо чтобы раздражало, из разряда: я изучил проблему вплоть до исходников ядра и решения нет, только кодить самому. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.