Jump to content

Recommended Posts

Posted

Сделал небольшой "отладчик" для задач планировщика; скрипт, который вручную запускает задачи из планировщика максимально близко к тому, как будет в действительности.

Скрытый текст

#!/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 в разных шеллах работает по разному). Тут я пробовал по всякому, в том числе разделять строку по символу ;, выделять в подстроке первое слово и проверять, является ли оно внешней программой. Но слишком сложно и ненадежно.

 

Posted

Принципиально это мало что меняет.

Я думал, что может быть можно с флагами setuid это сделать, но что-то не выходит.

Поэтому сделал проще — поместил скрипт в /usr/sbin и сказал, что его может использовать только root (либо пользователь через sudo).

Тот может вызывать sudo без пароля и все работает.

 

С временным файлом вроде бы так же получилось решить вопрос.

Нужно во-первых вручную составить список переменных окружения (для передачи в env), а во-вторых экранировать некоторые символы перед вызовом bash /c.

Правда переносимость между разными шеллами так же отсутствует, ну тут уж ничего не поделать. Я все равно во временном файле указываю bash.

Posted

FreeBSD я вообще стараюсь трогать пореже.

Остался один сервер на 8.2, через пару недель поставлю на нем какой-нибудь CentOS и вздохну свободно.

FreeBSD подходит для статичных необслуживаемых систем, где один раз настроил и забыл на несколько лет, пока сервис или железо не помрет. А если нужно обслуживание, обновление или модернизация, то линукс удобнее.

Posted
7 часов назад, alibek сказал:

Ну так sh многое не умеет, особенно по части работы с подстроками и массивами. 

моё ИМХО: если вам такое понадобилось, то берите нормальный язык программирования по вкусу, а не шелл.

Posted

Во временном файле нет ничего плохого, если вы не запускаете скрипт по 100 раз в секунду. Но лучше использовать mktemp на всякий пожарный

В конфиге sudo можно включить NOPASSWD, но в вашей реализации это будет большой дырой в безопасности.

Posted
1 минуту назад, ixi сказал:

Во временном файле нет ничего плохого

Кроме того, что нужен rw-доступ к файловой системе.

Подобные скрипты иногда запускаются на всяких коробочках, у которых вместо диска NAND или обычная флешка; в этом случае чем меньше трогать память, тем лучше.

 

4 минуты назад, ixi сказал:

это будет большой дырой в безопасности

Я это и имел ввиду в самом первом сообщении (что нет идей, как обойти запрос пароля; отключения запроса пароля будет куда хуже).

Сейчас остановился на том, что скрипт перенес в sbin, соответственно его должен запускать не рядовой пользователь, а для root пароль на sudo не нужен.

Posted

Проще сразу не использовать временные файлы, чем искать подходящее для них место.

Сейчас под рукой нет железки, чтобы перепроверить, но на EdgeRouter (Vyatta) по-моему /tmp находится на флешке. И не уверен, есть ли там /dev/shm (там не самое свежее ядро).

Posted
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

Posted
1 час назад, Ivan_83 сказал:

shell умеет много всего при прямых руках

Но вот обработка строк, вложенные команды и подпроцессы — не его сильное место.

Posted
1 час назад, alibek сказал:

Но вот обработка строк, вложенные команды и подпроцессы — не его сильное место.

1. Всё необходимое можно реализовать, может не так просто и лаконично как в баше, но и не на порядки сложнее.

http://www.netlab.linkpc.net/download/software/entware/opt/bin/app_disabler.sh

 

2. У вас довольно простой скрипт.

Posted
9 часов назад, Ivan_83 сказал:

Так и пишите что вы его лучше знаете и что для вас там уже кто то другой всё автоматизировал.

@Ivan_83  +1 к карме, за данный пост.

Конечно факт, что в 2021 фряха стала уступать linux'о подобным OS. Но закат еще не близок!

Кстати, в других проектах не встречал support на русском языке =) 

Posted
15 часов назад, RN3DCX сказал:

Конечно факт, что в 2021 фряха стала уступать linux'о подобным OS. Но закат еще не близок!

По дровам у нас хуже, да. Но может статься что скоро у нас почти любы дрова линукса будут заводится после простого копирования и сборки исходников.

По каким то плюшкам - ну может, из критичного для меня почти всё появилось и работает, на десктопе с каждым годом всё комфортнее и комфортнее жить.

На сервере у меня и не было никакого дискомфорта с фрёй, прямо чтобы раздражало, из разряда: я изучил проблему вплоть до исходников ядра и решения нет, только кодить самому.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.