alibek Опубликовано 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 в разных шеллах работает по разному). Тут я пробовал по всякому, в том числе разделять строку по символу ;, выделять в подстроке первое слово и проверять, является ли оно внешней программой. Но слишком сложно и ненадежно. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
vop Опубликовано 19 июня, 2021 · Жалоба sudo -n? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 19 июня, 2021 · Жалоба Принципиально это мало что меняет. Я думал, что может быть можно с флагами setuid это сделать, но что-то не выходит. Поэтому сделал проще — поместил скрипт в /usr/sbin и сказал, что его может использовать только root (либо пользователь через sudo). Тот может вызывать sudo без пароля и все работает. С временным файлом вроде бы так же получилось решить вопрос. Нужно во-первых вручную составить список переменных окружения (для передачи в env), а во-вторых экранировать некоторые символы перед вызовом bash /c. Правда переносимость между разными шеллами так же отсутствует, ну тут уж ничего не поделать. Я все равно во временном файле указываю bash. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 21 июня, 2021 · Жалоба Как же вы достали везде пихать bash вместо sh. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 21 июня, 2021 · Жалоба Ну так sh многое не умеет, особенно по части работы с подстроками и массивами. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
vop Опубликовано 21 июня, 2021 · Жалоба 2 hours ago, Ivan_83 said: Как же вы достали везде пихать bash вместо sh. FreeBSD научила меня писать: #!/usr/bin/env bash :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 21 июня, 2021 · Жалоба FreeBSD я вообще стараюсь трогать пореже. Остался один сервер на 8.2, через пару недель поставлю на нем какой-нибудь CentOS и вздохну свободно. FreeBSD подходит для статичных необслуживаемых систем, где один раз настроил и забыл на несколько лет, пока сервис или железо не помрет. А если нужно обслуживание, обновление или модернизация, то линукс удобнее. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
edo Опубликовано 22 июня, 2021 · Жалоба 7 часов назад, alibek сказал: Ну так sh многое не умеет, особенно по части работы с подстроками и массивами. моё ИМХО: если вам такое понадобилось, то берите нормальный язык программирования по вкусу, а не шелл. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ixi Опубликовано 22 июня, 2021 · Жалоба Во временном файле нет ничего плохого, если вы не запускаете скрипт по 100 раз в секунду. Но лучше использовать mktemp на всякий пожарный В конфиге sudo можно включить NOPASSWD, но в вашей реализации это будет большой дырой в безопасности. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 22 июня, 2021 · Жалоба 1 минуту назад, ixi сказал: Во временном файле нет ничего плохого Кроме того, что нужен rw-доступ к файловой системе. Подобные скрипты иногда запускаются на всяких коробочках, у которых вместо диска NAND или обычная флешка; в этом случае чем меньше трогать память, тем лучше. 4 минуты назад, ixi сказал: это будет большой дырой в безопасности Я это и имел ввиду в самом первом сообщении (что нет идей, как обойти запрос пароля; отключения запроса пароля будет куда хуже). Сейчас остановился на том, что скрипт перенес в sbin, соответственно его должен запускать не рядовой пользователь, а для root пароль на sudo не нужен. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ixi Опубликовано 22 июня, 2021 · Жалоба 23 минуты назад, alibek сказал: , у которых вместо диска NAND или обычная флешка tmpfs? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 22 июня, 2021 · Жалоба Проще сразу не использовать временные файлы, чем искать подходящее для них место. Сейчас под рукой нет железки, чтобы перепроверить, но на EdgeRouter (Vyatta) по-моему /tmp находится на флешке. И не уверен, есть ли там /dev/shm (там не самое свежее ядро). Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 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 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 22 июня, 2021 · Жалоба 1 час назад, Ivan_83 сказал: shell умеет много всего при прямых руках Но вот обработка строк, вложенные команды и подпроцессы — не его сильное место. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
pppoetest Опубликовано 22 июня, 2021 · Жалоба 25 минут назад, alibek сказал: обработка строк, вложенные команды и подпроцессы perl? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 22 июня, 2021 · Жалоба 1 час назад, alibek сказал: Но вот обработка строк, вложенные команды и подпроцессы — не его сильное место. 1. Всё необходимое можно реализовать, может не так просто и лаконично как в баше, но и не на порядки сложнее. http://www.netlab.linkpc.net/download/software/entware/opt/bin/app_disabler.sh 2. У вас довольно простой скрипт. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
RN3DCX Опубликовано 22 июня, 2021 · Жалоба 9 часов назад, Ivan_83 сказал: Так и пишите что вы его лучше знаете и что для вас там уже кто то другой всё автоматизировал. @Ivan_83 +1 к карме, за данный пост. Конечно факт, что в 2021 фряха стала уступать linux'о подобным OS. Но закат еще не близок! Кстати, в других проектах не встречал support на русском языке =) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ivan_83 Опубликовано 23 июня, 2021 · Жалоба 15 часов назад, RN3DCX сказал: Конечно факт, что в 2021 фряха стала уступать linux'о подобным OS. Но закат еще не близок! По дровам у нас хуже, да. Но может статься что скоро у нас почти любы дрова линукса будут заводится после простого копирования и сборки исходников. По каким то плюшкам - ну может, из критичного для меня почти всё появилось и работает, на десктопе с каждым годом всё комфортнее и комфортнее жить. На сервере у меня и не было никакого дискомфорта с фрёй, прямо чтобы раздражало, из разряда: я изучил проблему вплоть до исходников ядра и решения нет, только кодить самому. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...