Создание одноразового загрузочного скрипта

#perl #systemd

#perl #systemd

Вопрос:

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

Я создал некоторый Perl для сборки файла модуля и создания сценария, который будет выполнять и очищать другие части. По какой-то причине я могу sudo systemctl start onetimerun , и соответствующая вещь происходит немедленно. Однако даже после a sudo systemctl enable onetimerun он по-прежнему не запускается при загрузке.

Это код Perl, который у меня есть, который должен создать соответствующую среду для запуска скрипта в /tmp/ одноразовом запуске / scripts/

 #!/usr/local/bin/perl -w

my $unitFile = <<'END_MESSAGE';
[Unit]
Description=Ooe-time executor for ad-hoc boot scripts
After=basic.target rescue.service rescue.target

[Service]
Type=oneshot
ExecStart=/tmp/one-time-run/runwrangler.pl

[Install]
WantedBy=multi-user.target
END_MESSAGE

my $runScript = <<'END_MESSAGE';
#!/usr/local/bin/perl -w
use Data::Dumper;
my @scriptFiles = map { $_ =~ s/s//gr } `for i in $(ls /tmp/one-time-run/scripts/*.sh); do test -x "$i" -a ! -d "$i" amp;amp; echo "$i"; done;`;
print Dumper @scriptFiles;
foreach my $file (@scriptFiles) {
  if(!(system("$file"))) {
     print "Failed to run $filen";
  }
  else {
    system("rm $file");
  }
}
system('rm /tmp/one-time-run/runwrangler.pl');
system('rm /run/systemd/system/onetimerun.service');
END_MESSAGE

unless(open UNITFILE, '>/run/systemd/system/onetimerun.service') {
  die "nUnable to create unit file.n";
}

print UNITFILE $unitFile;
close UNITFILE;

system('mkdir /tmp/one-time-run/');

unless(open WRANGLER, '>/tmp/one-time-run/runwrangler.pl') {
  die "nUnable to create wrangler script.n";
}

print WRANGLER $runScript;
close WRANGLER;

system('chmod  x /tmp/one-time-run/runwrangler.pl');
system('systemctl daemon-reload');
system('systemctl enable onetimerun');
  

Я ожидаю, что любой скрипт в /tmp/ одноразовом запуске /scripts/ будет запущен и впоследствии удален перед удалением файла модуля и удалением wrangler.

Вместо этого, похоже, ничего не происходит при загрузке.

Комментарии:

1. «Кажется, при загрузке ничего не происходит» — это неадекватное описание проблемы. Вы даже проверили, запущен ли скрипт? Если это так, это создало бы файл или, по крайней мере, сгенерировало сообщение об ошибке.

2. Это кажется очень рискованным с точки зрения безопасности. Как вы собираетесь снизить риск того, что все смогут писать по этому пути?

3. @ikegami, скрипт не запускается, насколько я могу судить. journalctl выдает: « — Reboot — 22 апреля 16:35:31 <имя хоста> systemd[1]: не удается добавить задание зависимости для модуля onetimerun.service, игнорирование: модуль не найден. 22 апреля 16:35:31 <имя хоста> systemd[1]: не удается добавить задание зависимости для модуля onetimerun.service, игнорирование: модуль не найден. «` Я поместил скрипт в соответствующий каталог, чтобы добавить что-то в свой домашний каталог, но он ничего не сделал. Однако, насколько я могу судить, в том, как я ориентируюсь на вещи, нет ничего необычного.

4. @manchicken: Вы не ошибаетесь; это определенно немного набросок. Единственное, что делает его безопасным, это то, что я использую его сам, настраиваю и немедленно перезагружаю. Идея в том, что я могу что-то сделать, сделать так, чтобы что-то произошло сразу после перезагрузки, а затем перезагрузиться, чтобы завершить это. Опытный злоумышленник будет следить за изменениями в этом каталоге и записывать в него что-то между запуском скрипта и перезагрузкой, но это займет не более нескольких секунд, и служба удалит себя после завершения. (Вся цель состоит в том, чтобы оставить конфигурацию системы нетронутой после выполнения.)

5. Повторите » скрипт не запускается, насколько я могу судить «, в этом случае это не проблема Perl. Это даже не проблема программирования, так что вы даже не на том сайте. Самое главное, что вы не предоставили никакой информации о проблеме. (Какая система, почему вы считаете, что она должна выполняться при запуске и т. Д.)