How do I execute a bash script that requires root privileges?
I have this script lines from my ISP:
sudo bash
echo "plugin L2TP.ppp">>/etc/ppp/options
echo "l2tpnoipsec">>/etc/ppp/options
It works if I paste line by line into Terminal. I want to create a *.command file and run it by double-clicking. But all I get is password prompting and then empty bash window. The resulting "options" file is empty.
I tried this:
#!/bin/bash
echo "plugin L2TP.ppp">>/etc/ppp/options
echo "l2tpnoipsec">>/etc/ppp/options
I get:
/etc/ppp/options: Permission denied
I think I need to use some command to get root privileges from inside bash.
Solution 1:
Take the script that you created:
#!/bin/bash
echo "plugin L2TP.ppp">>/etc/ppp/options
echo "l2tpnoipsec">>/etc/ppp/options
Save it in your home directory, or a 'scripts' directory inside your home directory, as l2tp.sh. Allow it to be executed(write this command in Terminal):
chmod 700 ~/path/to/l2tp.sh
To execute the file using sudo (root privileges):
Method #1. In Terminal type:
$ sudo ~/path/to/l2tp.sh
Method #2. Create a file run_l2tp.command with this contents:
sudo ~/path/to/l2tp.sh
Allow it to be executed:
chmod u+x run_l2tp.command
When you double-click run_l2tp.command and enter the password the l2tp.sh file will be executed with root privileges.
Some notes:
- On UNIX like systems, ~ is short for "my home directory".
- Chmod 700 will make the file executable only by you. For more information: see this Wikipedia page.
- typing 'sudo' before a command will execute the program using root privileges. Be careful when doing this, bad things can happen if you're not sure what you're doing.
- Obviously you can omit the /path/to if you saved this script directly in your home directory.
Solution 2:
Save this:
#!/bin/bash
echo "plugin L2TP.ppp">>/etc/ppp/options
echo "l2tpnoipsec">>/etc/ppp/options
to your Desktop in a file named script.sh
.
Open a Terminal window and type:
sudo bash ~/Desktop/script.sh
Enter your password when prompted and all the commands in the file will run with super user privledges.
Solution 3:
If for security purposes, you don't want any user of your system to be able to run the script, but rather you want to be prompted for an administrative password, an alternate solution would be to save the shell script and then use the program AppleScript Editor to create an AppleScript.
The AppleScript would be a one-liner, saying do shell script «your script's name here» with administrator privileges
. Save that script as an Application. Then, when you click it, it will ask you for an administrator password, then run the shell script with administrator privileges.
Obviously, replace «your script's name here»
with the path to your script.
Solution 4:
The problem's that when you do it from the command line, what you're doing is starting bash
under sudo
, and then sending those next two commands to bash
, not the original shell. (the sign being that you need to exit
twice)
When you do it in a script, the bash
command never exits, so the next two commands never run.
It's not as elegant as the AppleScript solution, but if you're going to do this as a script from the command line, the equivalent would be:
#!/bin/sh --
sudo bash -c 'echo "plugin L2TP.ppp">>/etc/ppp/options'
sudo bash -c 'echo "l2tpnoipsec">>/etc/ppp/options'
If we didn't need the io redirection (the >>
bit), we could just call the command directly via sudo
without needing the sudo sh -c
trick. (and note that I had to quote the argument to sh -c
to keep it from running the echo as root, but the file appending as the original user.)
It will work as a .command
file from the Finder, but it'll bring up a terminal window, asking for your password, and if entered correctly, will run the commands. (assuming you haven't recently authenticated for sudo
... if you have, it'll run through without prompting)