Перейти к содержимому
Калькуляторы

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

 

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

2 hours ago, Ivan_83 said:

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

 

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

 

#!/usr/bin/env bash

:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

23 минуты назад, alibek сказал:

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

tmpfs?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

25 минут назад, alibek сказал:

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

perl?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.