Возможна ли передача другого $0 дочернему сценарию bash?

Я бы рассмотрел два подхода

  1. Оставьте планирование нетронутым, но запустите все cronзадания подniceи, возможно, дажеionice:

    0 * * * *    root    ionice -c3 nice /some/command and parameters
    
  2. Запретить любые cronзадания в определенное время. Помните, что любой пользователь, который может создать (или удалить )файл флага, может контролировать этот подход. Это может сработать, если вы хотите настроить игровой режим по запросу , добавив команды touchи rmв сценарий запуска -вашей игры. (Возможно, вам придется использовать /tmp, а не /var/run, но тогда это тривиально открыто для любого пользователя.)

    0 18 * * *      root    touch /var/run/no_cron
    0 19 * * *      root    rm -f /var/run/no_cron
    
    0 * * * *       root    test ! -f /var/run/no_cron && /some/command...
    

После настройки ни один из подходов не требует root-доступа. Более того, вы можете заранее решить, какие работы подлежат такому контролю, а какие нет.

12
25.12.2019, 22:00
3 ответа

Может, так и пойдет:

bash -c '. /path/to/unmodifiable' /fake/path args...

Очевидно, /path/to/unmodifiableдолжен быть скриптом оболочки; этот глупый трюк не будет работать с другими типами исполняемых файлов. Это также не будет работать с zsh(, но будет работать с другими оболочками, такими как dash, kshи т. д. ).

Если вам нужно вызвать вместо вызова немодифицируемого скрипта, вы можете использовать тот же прием из оболочки, вызывающей ваш внешний скрипт, или сделать так, чтобы он -вызывал сам себя:

$ cat unmodifiable
#! /bin/sh
printf '{%s} ' "$0" "$@"
echo

$ cat becoming
#! /bin/sh
[ "$MYSELF" ] || MYSELF=$0 exec sh -c '. "$MYSELF"' "I'm the mountain!" "$@"
../unmodifiable

$ chmod 755 becoming
$./becoming 1 2 3
{I'm the mountain!} {1} {2} {3}
18
27.01.2020, 19:54

Вы не можете «обмануть» дочерний скрипт, но вы можете вызвать его через другое имя, создав символическую ссылку на вызываемый скрипт и вызвав символическую ссылку. Я верю, что это позволит достичь цели, которую вы ищете.

Пример:

$ cat./bin/script.sh
echo $0

$./bin/script.sh
./bin/script.sh
$ ln -s bin/script.sh foo.sh
$./foo.sh
./foo.sh
19
27.01.2020, 19:54

Вы можете использовать exec -aв подоболочке:(exec -a fakeDollarZero /unmodifiable/bash/script the rest of the args)

В отличие от ответа mosvy , это сработает, даже если это не bash-скрипт.

0
27.01.2020, 19:54

Теги

Похожие вопросы