How to Run Bash Script as Root During Startup on Linux

What is Startup script in Linux?

Think of it like this: a startup script is something that is run automatically by some program. For example: say you don’t like the default clock your OS has.

Remove the script from startup

In the same way that the command was added to the crontab, it can be removed. To do this, open up a terminal and enter sudo crontab -e. This will load the crontab file. Just delete the command that was added, save it, and restart the computer (or server).

How do I run a bash script at startup?

  1. Create a file for your startup script and write your script in the file: $ sudo nano /etc/init.d/superscript.
  2. Save and exit: Ctrl + X , Y , Enter.
  3. Make the script executable: $ sudo chmod 755 /etc/init.d/superscript.
  4. Register script to be run at startup: $ sudo update-rc.d superscript defaults.

How do I get a script to run on startup in Linux?

There is more than one way to do this.

  1. Put the command in your crontab file. The crontab file in Linux is a daemon that performs user-edited tasks at specific times and events. …
  2. Put a script containing the command in your /etc directory. Create a script such as «startup.sh» using your favorite text editor. …
  3. Edit the /rc.

How do I run a command prompt at startup?

Run a script on start up on Windows 10

  1. Create a shortcut to the batch file.
  2. Once the shortcut is created, right-click the shortcut file and select Cut.
  3. Click Start, then Programs or All Programs. …
  4. Once the Startup folder is opened, click Edit in the menu bar, then Paste to paste the shortcut file into the Startup folder.

Have you ever wanted to run a script at startup with root privileges? If you have a home server, or maybe even just a Linux desktop, this might have crossed your mind. This sounds iffy, but if you understand the risks, the reward for doing this can be quite good.

The main reasons are that there would be no more starting up the server, logging in over ssh, entering a password, getting a root shell and then manually executing script after script. Instead, harness the power of cron, and set your system to automatically run these scripts at startup! Here’s how to do it.

Tip: Check out our regular expressions cheatsheet.

What do you need to run PHP as root?

You will need to use visudo and edit the sudoers file.

How not to run PHP scripts as root!

In other words –

The install will typically fail because Apache would need to request elevated permissions. Believe me when I say that this is a good thing.

https://youtube.com/watch?v=YSSIm0g00m4%3Ffeature%3Doembed

How do you adjust the sudoers file with visudo?

The bad way –

sudo visudo -f /etc/sudoers.d/myOverrides
www-data ALL=(ALL) NOPASSWD: ALL

Again, avoid this method at all costs! It is a bad idea.

The better way –

www-data ALL=(ALL) NOPASSWD: /path/to/myscript/createUser.sh
#!/bin/bash
echo "Adding user $1..."
pwd=$(perl -e 'print crypt($ARGV[0], "password")' $2)
useradd -m -p $pwd $1
<?php
echo shell_exec("sudo /path/to/my/script/createUser.sh myUsername myPassword");
?>

You may also be interested in


About the Authors

Anto’s editorial team loves the cloud as much as you! Each member of Anto’s editorial team is a Cloud expert in their own right. Anto Online takes great pride in helping fellow Cloud enthusiasts. Let us know if you have an excellent idea for the next topic! Contact Anto Online if you want to contribute.

Support the Cause

Support Anto Online and buy us a coffee. Anything is possible with coffee and code.

Buy me a coffee


I tend to address this by allowing the process that runs the server, in this case the webserver, to execute the relevant command, and only that command, via passwordless sudo.

nagios  ALL=(root) NOPASSWD: /usr/lib/nagios/plugins/check_md_raid

You would have something similar, perhaps:

apache  ALL=(root) NOPASSWD: /sbin/service dnsmasq restart

To address your concerns above, this doesn’t allow anyone who can subvert the apache process to run sudo bash, sudo shutdown -h now, or even sudo service dnsmasq stop. It only allows exactly what’s specified in the sudoers file.

It’s true that if the service command is badly written, and if someone can find a way to make running service dnsmasq stop as root via sudo change the mode on the passwd file, or start an allow-all sshd on port 22222, or indeed do anything nefarious, then you have a problem. But in such a case you have a problem however you run the service command as root, whether it’s via sudo or any other mechanism. sudo does its best to sanitise the environment, and the service command is a stock part of most GNU/Linuxes (and has been for some time) and therefore probably has no obvious holes.

Дополнительно:  Named root cache

Running the service command via passwordless sudo is no less safe than any other method of running it, and probably more safe than many home-brewed or other less-well-tested ways.

I’m trying to write a bash script (in Ubuntu) that will backup a directory using tar.

How can I do a check in the script so that it can only be run as root (or with sudo)?

I know there has to be an easy solution, I just haven’t been able to find it by googling.

asked Jul 8, 2009 at 17:30

Cory Plastek's user avatar

To pull the effective uid use this command:

id -u

If the result is ‘0’ then the script is either running as root, or using sudo. You can run the check by doing something like:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

answered Jul 8, 2009 at 17:36

Scott Pack's user avatar

Scott Pack

10 gold badges53 silver badges83 bronze badges

I assume you know that by changing the ownership to root

chown root:root file

and setting the permissions to 700

chmod 700 file

you will accomplish the same thing — without the suggestion to run as sudo.

But I will post this answer for completeness.

answered Jul 8, 2009 at 17:43

Brent 's user avatar

19 gold badges70 silver badges102 bronze badges

The bash variable $EUID shows the effective UID the script is running at, if you want to make sure the script runs as root, check wether $EUID contains the value 0 or not:

if [[ $EUID -ne 0 ]]; then
    echo "$0 is not running as root. Try using sudo."
    exit 2
fi

This is better than the solution with /usr/bin/id (for bash scripts!) because it doesn’t require an external command.

answered Mar 24, 2015 at 13:56

neuhaus's user avatar

2 silver badges6 bronze badges

You can use whoami command as well.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

answered Jul 22, 2009 at 9:12

Kiril's user avatar

1 gold badge2 silver badges7 bronze badges

answered Jul 8, 2009 at 18:02

theotherreceive's user avatar

1 gold badge31 silver badges44 bronze badges

One simple way to make the script only runnable by root is to start the script with the line:
#!/bin/su root

answered Aug 13, 2016 at 20:55

alexandre1985's user avatar

1 gold badge2 silver badges9 bronze badges

answered May 15, 2017 at 18:12

Lynnux's user avatar

How to make a script execute as root, no matter who executes it?

I read about setuid but I’m not sure how to do this.

I’m using Linux, Ubuntu 12.04 LTS.

Deltik's user avatar

17 gold badges72 silver badges114 bronze badges

asked Jun 22, 2012 at 19:29

HappyDeveloper's user avatar

8 gold badges19 silver badges34 bronze badges

Be really careful: scripts combined with setuid are dangerous!

First, please have a look on this question/answers, especially on this answer and security warning.

If you still want to execute your script with setuid set, then you can write a short C program as wrapper and set the setuid bit on the compiled binary.

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Another solution using sudo (mentioned here):

  1. As root, prevent write (and maybe other) access to your script:

    chown root /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Verify that noone except root can replace the script, e.g. by modifying the access rights of the parent folder:

    chown root /absolute/path/to/your/
    chmod 755 /absolute/path/to/your/
    
  3. Modify sudo access rights in /etc/sudoers with visudo:

    ALL    ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
    
sudo /absolute/path/to/your/script.sh

This is similar to using the wrapper/setuid solution above.

Community's user avatar

answered Jun 22, 2012 at 21:06

speakr's user avatar

Easiest and safest way is to use SETUID bits in file permissions.
that way command permissions will be elevated to file owner permissions.

to prevent script from edition do not set write for everyone bits.

answered Nov 1, 2012 at 13:15

Tadas's user avatar

1 bronze badge

I don’t know if this may be useful but, to make the script only run as root, you could use this shebang on the first line of the script:

#!/bin/su root

answered May 25, 2019 at 11:29

alexandre1985's user avatar

Stumbled across this question when I was searching for a snippet like this:

[ "$(id -u)" != 0 ] && exec sudo "$0"

Adding this to the top of a script will preface it with sudo and ensure it’ll always run as root, allowing us to run our script as ./hello.sh. Of course, sudo will still ask for a password, but the accepted answer will help avoid that.

answered Aug 12, 2020 at 15:29

Andrey Kaipov's user avatar

allez

Сообщения: 2223
Статус: Не очень злой админ 🙂
ОС: SuSE, CentOS, FreeBSD, Windows

Re: запуск скрипта от имени root


Можно, конечно, и так — использовать sudo в самом скрипте, а можно и просто весь скрипт запустить командой вида «sudo script.sh».

Аватара пользователя

Bizdelnick

Модератор
Сообщения: 20366
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: запуск скрипта от имени root


safronowmax писал(а):

vbox ALL=(ALL) ALL,

Вам, видимо, нужно что-то вроде

Код: Выделить всё

vbox localhost = NOPASSWD: /usr/local/bin/myscript

Аватара пользователя

eddy

Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux
Контактная информация:

Re: запуск скрипта от имени root


А не лучше ли по-человечески сделать: suid добавить, из демона вызвать или еще как?

RTFM
——-
KOI8-R — патриотичная кодировка Изображение

Аватара пользователя

drBatty

Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит…
ОС: Slackware-current
Контактная информация:

Re: запуск скрипта от имени root


trendix писал(а):

А нельзя изменить пользователя у этого скрипта?

можно. А зачем? вопрос о запуске от имени рута — ему плевать на хозяина.

trendix писал(а):

А нельзя ли его запускать при старте ОС?

дистрибутивозависимо. Есть универсальный вариант — /etc/rc.local

Аватара пользователя

drBatty

Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит…
ОС: Slackware-current
Контактная информация:

Re: запуск скрипта от имени root


liaonau писал(а):

И вызван когнитивный диссонанс ☺

у гентушника? о_О
может вам рассказать, где у вас компилятор, и как называется?
По теме: используйте /etc/conf.d/local.start, если у вас гента, и вы этого не знаете.

liaonau писал(а):

Нет универсального ответа

/etc/rc.local это универсальный ответ для большинства дистрибутивов, но он не Ъ. Например в слаке такого тоже делать не нужно, там /etc/rc.d/rc.local (только все слакварщики, в отличие от гентушников, в курсе)

Kopilov

Сообщения: 929
ОС: [K]Ubuntu, Debian

Re: запуск скрипта от имени root


drBatty писал(а):

По теме: используйте /etc/conf.d/local.start, если у вас гента, и вы этого не знаете.

Откуда такая информация?
В моей рабочей генте (ветка stable, обновлял месяц назад) такого файла нет, и я не сталкивался с предложением его создать.
А каталог

liaonau писал(а):

/etc/local.d/

имеется, и в нём лежит файл README с информацией:

Код: Выделить всё

This directory should contain programs or scripts which are to be run
when the local service is started or stopped.

If a file in this directory is executable and it has a .start extension,
it will be run when the local service is started. If a file is
executable and it has a .stop extension, it will be run when the local
service is stopped.

All files are processed in lexical order.

Аватара пользователя

Poor Fred

Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: запуск скрипта от имени root


Poor Fred »

safronowmax писал(а):

Проблема в том, что данный скрипт будет отдавать данные в zabbix, и такой вариант не подойдет, попробовал в /etc/sudoerc прописать пользователя с правами root: vbox ALL=(ALL) ALL, но что-то все равно не работает

Как будет отдавать? Может быть, наоборот, zabbix-agent будет сам забирать? Тогда и пользователь должен быть другой. zabbix, как ни странно.

drBatty писал(а):

По теме: используйте /etc/conf.d/local.start, если у вас гента, и вы этого не знаете.

В Генте это давно устарело.

Убить всех человеков!

Kopilov

Сообщения: 929
ОС: [K]Ubuntu, Debian

Re: запуск скрипта от имени root


Обратите внимание на дату:

Автор Xakep, дата создания 3 апреля, 2006 — 12:11.
/etc/conf.d/local.start

А чуть ниже и про /etc/local.d/README написано

Автор _SerEga_, дата создания 10 февраля, 2012 — 11:51.
cat /etc/local.d/README

Если в Slackware документация не теряет актуальности за шесть лет — я буду поражён её консервативностью.

liaonau

Сообщения: 390
ОС: gentoo

Re: запуск скрипта от имени root


drBatty писал(а):

у гентушника? о_О
может вам рассказать, где у вас компилятор, и как называется?

У любого логичного человека. Поражаюсь всегда тому, что вам хочется комментировать любой вопрос вне зависимости от уровня осведомленности в нем:

drBatty писал(а):

По теме: используйте /etc/conf.d/local.start, если у вас гента, и вы этого не знаете.

Аватара пользователя

drBatty

Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит…
ОС: Slackware-current
Контактная информация:

Re: запуск скрипта от имени root


Poor Fred писал(а):

В Генте это давно устарело.

Kopilov писал(а):

Если в Slackware документация не теряет актуальности за шесть лет — я буду поражён её консервативностью.

смотря на что. Когда KDE3 сменилась на KDE4 то очевидно и документация поменялась, но вот какой смысл менять загрузочные скрипты — мне непонятно. Ну а раз они не меняются, то и документация к ним тоже.

liaonau писал(а):

У любого логичного человека. Поражаюсь всегда тому, что вам хочется комментировать любой вопрос вне зависимости от уровня осведомленности в нем

Аватара пользователя

taaroa

Сообщения: 1319

Re: запуск скрипта от имени root


Vascom писал(а):

Да сделай уже автозагрузку через модуль systemd

в rhel6 и ubuntu 12.04 нет systemd, например.

— Рядовой Петров! А о чем вы думаете, когда смотрите на этот кирпич?
— О системд, товарищ старшина.
— Как о системд?!
— А я всегда о нем думаю.

Vascom писал(а):

и хватит спорить по пустякам.

Аватара пользователя

Bizdelnick

Модератор
Сообщения: 20366
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: запуск скрипта от имени root


Я не очень понимаю, о чём спор, если ТС уже неделю как в теме не отмечался.

Аватара пользователя

Poor Fred

Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: запуск скрипта от имени root


Poor Fred »

drBatty писал(а):

Poor Fred писал(а):

В Генте это давно устарело.

Зачем? Кто в Генту сидит — сам знает, кто устанавливает с нуля — сам увидит при редактировании конфигов. А кто другие дистрибы юзает — тем это безразлично.

Убить всех человеков!

How do I make a shell script run automatically?

You have several options to run the script on remote machine: copy the file on the remote machine in the same location with the same file name (with ftp or ssh you can do this with another script) and set the linux machine’s cron job to execute that same file daily.

How do I run a script without Sudo?

  1. cd /PATH/TO/FOLDER.
  2. chmod u+x ./filename (u — user, +x — execute permissions)
  3. if you want to execute it without .sh, add the following shebang line to the first line of the file: #!/bin/bash.
  4. If you want to execute it from anywhere on your system add the path of the folder to the $PATH variable.

Setting up the script with Cron

cron-load-new-crontab

reboot homederrikstartupscript.sh

cron-add-bash-script-to-crontab

cron-save-crontab-file

How do I write a script in Linux?

How to Write Shell Script in Linux/Unix

  1. Create a file using a vi editor(or any other editor). Name script file with extension . sh.
  2. Start the script with #! /bin/sh.
  3. Write some code.
  4. Save the script file as filename.sh.
  5. For executing the script type bash filename.sh.

Setting up Cron

Most Linux distributions come with the ability to access cron by just entering crontab -e. However, if you’ve entered this command, and nothing at all has happened, you’re on a Linux distribution that has no way to interact with cron. This means that you’ll need to install a tool to continue. The most popular tool to use in this situation is a daemon known as “cronie.” It’s a very popular tool and resides in most popular Linux distribution repositories.

Open up a terminal and install cronie with your package manager. Alternatively, head over to this page and download a package for your distribution.

How do I automate a Linux command?

Here are my steps, in order:

  1. launch putty, choose hostname & port, click Open (would love to script/automate this 1st part too)
  2. linux shell/terminal opens.
  3. I enter my login and pwd.
  4. I enter this command: sudo su — psoftXXX.
  5. I enter my pwd again and hit enter.
  6. I am presented with a little cmd-shell menu and a prompt. …
  7. cd /

Detailed

I have a Flask application which changes colours of an led-strip according to incoming requests.

Regardless of which library is used, accessing GPIO always needs root permission.

I would like to change this for two reasons:

  • I am using venv and running the app with sudo causes the globally installed python packaged to be used rather than the ones in venv.

  • In its finished state the application should run in apache. So far I didn’t get apache to run the app with sudo.


I would like to focus on the main problem, rather than Flask or the led-strip library.

Thanks in advance!

How do I run a shell script automatically in Unix?

  1. Run your test script without cron to make sure it actually works.
  2. Make sure you saved your command in cron, use sudo crontab -e.
  3. Reboot the server to confirm it all works sudo @reboot.

Troubleshooting Cron

Sometimes cron doesn’t execute commands, and that can be a problem. The easiest way to troubleshoot any issues with cron (should there be any) is to look at the system log. To do that, open the terminal window and enter this command:

  CRON varlogsyslog

Случилась беда с KRoN73

НАТО это опасная антироссийская военная организация, сильнейшая в мире.

Если так, то почему она не уничтожила вашу помойку в самый удобный момент, в начале 90х? Вместо этого зачем-то они стали помогать выжить. А ублюдочная помойка, нарастив жирок и встав на ноги, снова начала выпендриваться.

Так что факты говорят о том что к сожалению на самом деле никакая не антироссийская. К сожалению. Иначе бы биомусорки уже не было бы почти 20 лет.

чтобы заслужить такое предательство.

Какое предательство? Они вам клялись в верности? С чего биомусор считает что их бывшие колонии должны быть их вечными рабами? Совок давно растерял свои колонии. Всё, забудьте. Но вы вместо того чтобы заниматься своими внутренними проблемами, повышать качество своей жизни, продолжаете жить в говне и при этом всё своё внимание уделять тому, как живут граждане другой страны. Сидит биомусор за телевизором, жрёт пустую гречку, т.к. им вождь запретил нормальные продукты, а по телевизору каждый выпуск новостей только о том как весело скачут хохлы, пиндосы совсем офигели и в конце вождь обещает что всё будет хорошо.

Так что не жди что такие как я будем каяться.

Да всем насрать. Восстановите себе железный занавес, весь мир вздохнёт с облегчением. Я очень надеюсь что Пути всё же в скором времени вас отрежет от цивилизованного мира, отключит от сети, оставив только внутренний чебурнет. А когда решит уйти на пенсию, оставит после себя Кадырова в качестве преемника. А будете ли вы каяться, пофиг. История давно показала что вы настолько ублюдочная биомасса что никогда не раскаиваетесь в плохих поступках.

Но время всё раставляет по местам и вы не зря живёте так убого. Впрочем, несмотря на это, всё же живёте лучше чем заслуживаете. Хотя, какие там у вас перспективы?

Мы будем воевать (и поддерживать) за нейтральный военный статус Украины.

«Мы» это кто? Нет никаких вас. Надо будет, тебя или твоих ублюдочных детей бросят пушечным мясом в горячую точку, ничего у тебя не спрашивая. И воевать вы будете не за что-то, как ты тут пафосно пишешь, а за своего хозяина и его друзей. Пиздоболов таких как ты дохрена в сети, а на донбас поддерживать «Русский Мир» отправить некого. Так говоришь «мы», будто у вас патриотизм какой-то есть. Существование принудительной службы в армии как бы намекает что патриотизмом и не пахнет, на деле всё только исподтишка.

PS: Не украинец, если что. Вы не только им навредили.

anonymous

()

Using su

su [username]
su john
su -
su john -c 'command'

Using sudo

sudo [command]
sudo apt-get update

Problem

Let’s take for example a folder /path/to/folder.
First I make sure that the folder and all content is owned by root:

sudo chown -R root:root /path/to/folder
sudo chmod -R +x /path/to/folder
sudo chmod -R u+s /path/to/folder
sudo chmod -R 4755 /path/to/folder

But the script I want to run, still gives me:

Can't open /dev/mem: Permission denied

How do I run a Sudo file?

  1. Open a terminal.
  2. Browse to the folder where the executable file is stored.
  3. Type the following command: for any . bin file: sudo chmod +x filename.bin. for any .run file: sudo chmod +x filename.run.
  4. When asked for, type the required password and press Enter.

Using runuser

runuser [options] [username] [command]
runuser -l john -c 'ls -l'

The option -l is used to make the environment similar to a login shell and -c is used to specify the command that you want to run.

runuser -u john ls -l

How do I run a Linux command?

Launch a terminal from your desktop’s application menu and you will see the bash shell. There are other shells, but most Linux distributions use bash by default. Press Enter after typing a command to run it. Note that you don’t need to add an .exe or anything like that – programs don’t have file extensions on Linux.

Conclusion

What root scripts would you run at startup on your Linux box? Tell us below!

Subscribe to our newsletter!

Our latest tutorials delivered straight to your inbox

Дополнительно:  How to Change MySQL Root Password in Ubuntu 22.04?
Оцените статью
Master Hi-technology
Добавить комментарий