Fedora 33 -Запуск команды или сценария при запуске

Если/bin/sh-> /bin/dashявляется динамически подключаемым исполняемым файлом в вашей системе, как в моей (, вы можете проверить это с помощью файла (1 )), вы можете использовать для этого хак LD_PRELOAD.

Это работает следующим образом :Небольшая динамическая библиотека, загруженная LD_PRELOAD, переопределяет функцию glibc __libc_start_main(, которая вызывает функцию main()исполняемого файла ), и если argv[0] == /bin/sh, то она /bin/bashexec вместо этого с теми же аргументами (, за исключениемargv[0]); в противном случае он обращается к исходному __libc_start_main, как будто ничего не произошло.

$ cat sh_is_bash.c
#define _GNU_SOURCE     /* for RTLD_NEXT */
#include <string.h>
#include <unistd.h>
#include <dlfcn.h>
#include <err.h>
int __libc_start_main(
        int (*main)(int,char**,char**), int ac, char **av,
        int (*init)(int,char**,char**), void (*fini)(void),
        void (*rtld_fini)(void), void *stack_end)
{
        typeof(__libc_start_main) *real_lsm;
        if(ac > 0 && !strcmp(av[0], "/bin/sh")){
                av[0] = "/bin/bash";
                execv(av[0], av);
                err(1, "execv %s", av[0]);
        }else if(real_lsm = dlsym(RTLD_NEXT, "__libc_start_main"))
                return real_lsm(main, ac, av, init, fini, rtld_fini, stack_end);
        else
                errx(1, "BUG: dlsym: %s", dlerror());
}
$ cc -fPIC -shared -Wall -W -Wno-parentheses sh_is_bash.c -o sh_is_bash.so -ldl
$ LD_PRELOAD=`pwd`/sh_is_bash.so program...

Любой скрипт с шебангом #! /bin/shбудет выполняться с /bin/bashвместо /bin/sh, если переменная окружения LD_PRELOADсодержит абсолютный путь к sh_is_bash.so.

Это уродливо, но не требует серьезных изменений ни в вашей системе, ни в скриптах, легко развертывается и управляется, и для этого не нужны никакие специальные привилегии.

0
31.12.2020, 14:32
3 ответа

Я смог сделать это, создав свой собственный .desktopфайл в ~/.config/autostart.

Я использую Fedora Cinnamon Edition, но не уверен, что это работает в других дистрибутивах.

2
18.03.2021, 22:39
  • Создать юнит systemd
  • поместите его в /etc/rc.d/rc.local (это файл, а не каталог )и включите его:
sudo systemctl enable rc-local.service
0
18.03.2021, 22:39

Я бы поместил команду в crontab пользователя root с директивой @reboot, т.е.

@reboot /root/myscript.sh

Это быстрый и простой способ запуска небольших быстрых команд при запуске.

0
04.06.2021, 16:51

Теги

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