Jump to content
Калькуляторы

Вопрос по bash и линуксу

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

Как же вы достали везде пихать bash вместо sh.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
2 hours ago, Ivan_83 said:

Как же вы достали везде пихать bash вместо sh.

 

FreeBSD научила меня писать:

 

#!/usr/bin/env bash

:)

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
7 часов назад, alibek сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
1 минуту назад, ixi сказал:

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

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

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

 

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

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

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

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

Share this post


Link to post
Share on other sites
23 минуты назад, alibek сказал:

, у которых вместо диска NAND или обычная флешка

tmpfs?

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
1 час назад, Ivan_83 сказал:

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

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

Share this post


Link to post
Share on other sites
25 минут назад, alibek сказал:

обработка строк, вложенные команды и подпроцессы

perl?

Share this post


Link to post
Share on other sites
1 час назад, alibek сказал:

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

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

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

 

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

Share this post


Link to post
Share on other sites
9 часов назад, Ivan_83 сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
15 часов назад, RN3DCX сказал:

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this