Если/bin/sh
-> /bin/dash
является динамически подключаемым исполняемым файлом в вашей системе, как в моей (, вы можете проверить это с помощью файла (1 )), вы можете использовать для этого хак LD_PRELOAD
.
Это работает следующим образом :Небольшая динамическая библиотека, загруженная LD_PRELOAD
, переопределяет функцию glibc __libc_start_main
(, которая вызывает функцию main()
исполняемого файла ), и если argv[0] == /bin/sh
, то она /bin/bash
exec вместо этого с теми же аргументами (, за исключением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
.
Это уродливо, но не требует серьезных изменений ни в вашей системе, ни в скриптах, легко развертывается и управляется, и для этого не нужны никакие специальные привилегии.
Я смог сделать это, создав свой собственный .desktop
файл в ~/.config/autostart
.
Я использую Fedora Cinnamon Edition, но не уверен, что это работает в других дистрибутивах.
sudo systemctl enable rc-local.service
Я бы поместил команду в crontab пользователя root с директивой @reboot, т.е.
@reboot /root/myscript.sh
Это быстрый и простой способ запуска небольших быстрых команд при запуске.