- Execute a shell script in current shell with sudo permission
- 10 Answers 10
- Как запустить Bash скрипт в Linux
- Подготовка
- Запустить Bash скрипт из пути к скрипту
- Запустить Bash скрипт, используя bash
- Выполнить скрипт Bash, используя sh, zsh, dash
- Запуск скрипта Bash из любого места
- Запуск Bash скриптов из графического интерфейса
- Заключение
Execute a shell script in current shell with sudo permission
To execute a shell script in current shell, we need to use a period . or a source command. But why does it not work with a sudo permission? I have a script with execute permission called setup.sh . When I use a period, I get this:
$ sudo . ./setup.sh sudo: .: command not found
The source command also produces a similar error. Am I missing out something? What should I do to run the script with sudo permission in the same/current shell?
Despite the excellent answers, I think the problem is almost just a typo. Delete the first period that is by itself.
@beroe you are in error. The problem is not a typo. If setup.sh does not have execute privileges, then you must explicitly interpret it with bash. This can be done as bash setup.sh or source setup.sh or . setup.sh . However, because the latter 2 are bash built-ins, only the 1st form can be used with sudo which requires an executable. You can use sudo which bash and sudo which source and sudo which . to see what sudo will find.
@BrunoBronosky it looked (looks) to me like they are trying to run the first lone dot as a command. Since this specifies the current working directory, which is not a command, it throws that error. If they put ./setup.sh it would be a different story.
@beroe A lone dot is a shell command — specifically, it’s a shell builtin that’s equivalent to the source command (also a builtin).
10 Answers 10
I’m not sure if this breaks any rules but
What you are trying to do is impossible; your current shell is running under your regular user ID (i.e. without root the access sudo would give you), and there is no way to grant it root access. What sudo does is create a new *sub*process that runs as root. The subprocess could be just a regular program (e.g. sudo cp . runs the cp program in a root process) or it could be a root subshell, but it cannot be the current shell.
(It’s actually even more impossible than that, because the sudo command itself is executed as a subprocess of the current shell — meaning that in a sense it’s already too late for it to do anything in the «current shell», because that’s not where it executes.)
I’m not sure why this is the accepted answer when @JaseC’s answer below seems to work for me. sudo bash myscript.sh does exactly what I was looking for, and what the OP seemed to be asking for.
@dalesikkema: sudo bash myscript.sh will run the script in a subshell, rather than the current shell. If that works in your situation, great — but this particular question is about running the script as root in the current shell.
The entire premise of ambiguous because of the inaccurate word choice. «For executing a shell script in current shell, we need to use a period» No, that period doesn’t execute, it sources, inserts, reads, or interprets. Execution implies a disparate PID. So, we are unclear if/why they might care about the PID of their current shell.
I think you are confused about the difference between sourcing and executing a script.
Executing a script means creating a new process, and running the program. The program can be a shell script, or any other type of program. As it is a sub process, any environmental variables changed in the program will not affect the shell.
Sourcing a script can only be used with a bash script (if you are running bash). It effectively types the commands in as if you did them. This is useful as it lets a script change environmental variables in the shell.
Running a script is simple, you just type in the path to the script. . is the current directory. So ./script.sh will execute the file script.sh in the current directory. If the command is a single file (eg script.sh ), it will check all the folders in the PATH variable to find the script. Note that the current directory isn’t in PATH, so you can’t execute a file script.sh in the current directory by running script.sh , you need to run ./script.sh (unless the current directory is in the PATH, eg you can run ls while in the /bin dir).
Sourcing a script doesn’t use the PATH, and just searches for the path. Note that source isn’t a program — otherwise it wouldn’t be able to change environmental variables in the current shell. It is actually a bash built in command. Search /bin and /usr/bin — you won’t find a source program there. So to source a file script.sh in the current directory, you just use source script.sh .
How does sudo interact with this? Well sudo takes a program, and executes it as root. Eg sudo ./script.sh executes script.sh in a sub process but running as root.
What does sudo source ./script.sh do however? Remember source isn’t a program (rather a shell builtin)? Sudo expects a program name though, so it searches for a program named source . It doesn’t find one, and so fails. It isn’t possible to source a file running as root, without creating a new subprocess, as you cannot change the runner of a program (in this case, bash) after it has started.
I’m not sure what you actually wanted, but hopefully this will clear it up for you.
Here is a concrete example. Make the file script.sh in your current directory with the contents:
#!/bin/bash export NEW_VAR="hello" whoami echo "Some text"
Make it executable with chmod +x script.sh .
Now observe what happens with bash:
> ./script.sh david Some text > echo $NEW_VAR > sudo ./script.sh root Some text > echo $NEW_VAR > source script.sh david Some text > echo $NEW_VAR hello > sudo source script.sh sudo: source: command not found
Как запустить Bash скрипт в Linux
Как системный администратор, вполне вероятно, что вы написали несколько сценариев Bash для автоматизации вашей работы. Например, вы можете запускать сценарии Bash для резервного копирования вашей работы или для регистрации некоторых событий, происходящих на вашем сервере.
Скрипты Bash, как и скрипты, написанные на других языках программирования, могут запускаться различными способами.
В этой статье мы расскажем о всех способах запуска скрипта Bash в Linux.
Подготовка
Прежде чем вы сможете запустить ваш скрипт, вам нужно, чтобы ваш скрипт был исполняемым. Чтобы сделать исполняемый скрипт в Linux, используйте команду chmod и присвойте файлу права execute . Вы можете использовать двоичную или символическую запись, чтобы сделать ее исполняемой.
$ chmod u+x script $ chmod 744 script
Если вы не являетесь владельцем файла, вам необходимо убедиться, что вы принадлежите к правильной группе или что права доступа предоставлены «другой» группе в вашей системе.
В некоторых дистрибутивах ваш файл будет выделен другим цветом, когда он исполняемый.
Теперь, когда ваш файл исполняемый, давайте посмотрим, как можно легко запустить скрипт Bash.
Запустить Bash скрипт из пути к скрипту
Чтобы запустить Bash скрипт в Linux, просто укажите полный путь к скрипту и укажите аргументы, которые могут потребоваться для запуска Bash скрипта.
В качестве примера, скажем, у вас есть Bash-скрипт, расположенный в вашем домашнем каталоге.
Чтобы выполнить этот скрипт, вы можете указать полный путь к скрипту, который вы хотите запустить.
# Абсолютный путь $ /home/user/script # Абсолютный путь с аргументами $ /home/user/script "john" "jack" "jim"
Кроме того, вы можете указать относительный путь к скрипту Bash, который вы хотите запустить.
# Относительный путь $ ./script # Относительный путь с аргументами $ ./script "john" "jack" "jim"
Таким образом вы узнали, как легко запустить Bash-скрипт в своей системе.
Запустить Bash скрипт, используя bash
Чтобы запустить скрипт Bash в вашей системе, вы должны использовать команду bash и указать имя скрипта, который вы хотите выполнить, с необязательными аргументами.
Кроме того, вы можете использовать sh , если в вашем дистрибутиве установлена утилита sh .
В качестве примера, скажем, вы хотите запустить скрипт Bash с именем script . Чтобы выполнить его с помощью утилиты bash , вы должны выполнить следующую команду
$ bash script This is the output from your script!
Выполнить скрипт Bash, используя sh, zsh, dash
В зависимости от вашего дистрибутива, в вашей системе могут быть установлены другие утилиты оболочки.
Bash — интерпретатор оболочки, установленный по умолчанию, но вы можете захотеть выполнить ваш скрипт с использованием других интерпретаторов. Чтобы проверить, установлен ли интерпретатор оболочки в вашей системе, используйте команду which и укажите нужный интерпретатор.
$ which sh /usr/bin/sh $ which dash /usr/bin/dash
Когда вы определили интерпретатор оболочки, который хотите использовать, просто вызовите его, чтобы легко запустить скрипт.
Запуск скрипта Bash из любого места
В некоторых случаях вы можете запускать скрипты Bash, где бы вы ни находились в вашей системе.
Чтобы запустить скрипт Bash из любой точки вашей системы, вам нужно добавить свой скрипт в переменную среды PATH .
Благодаря тому, что путь к скрипту добавлен в PATH , вы можете вызывать его там, где хотите в своей системе.
$ script This is the output from script!
Кроме того, вы можете изменить переменную среды PATH в вашем файле .bashrc и использовать команду source для обновления вашей текущей среды Bash.
$ sudo nano ~/.bashrc export PATH=":$PATH"
Выйдите из файла и используйте команду source для файла bashrc для внесения изменений.
$ source ~/.bashrc $ echo $PATH /home/user/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Отлично! Теперь ваш скрипт может быть запущен из любой точки вашей системы.
Запуск Bash скриптов из графического интерфейса
Последний способ выполнения Bash скриптов — это использование графического интерфейса, в данном случае интерфейса GNOME.
Чтобы запустить ваши скрипты с использованием GNOME, вы должны установить в проводнике Ask what to do для исполняемых файлов.
Закройте это окно и дважды щелкните файл скрипта, который вы хотите выполнить.
При двойном щелчке вам предлагаются различные варианты: вы можете выбрать запуск скрипта (в терминале или нет) или просто отобразить содержимое файла.
В этом случае мы заинтересованы в запуске этого скрипта в терминале, поэтому нажмите на эту опцию.
Успех! Ваш скрипт был успешно выполнен
Заключение
Из этого руководства вы узнали, как легко запускать Bash скрипты в своей системе, указав путь к скрипту или интерпретаторы, доступные на вашем хосте. Вы узнали, что можете сделать это еще проще, добавив путь к скрипту в переменную среды PATH или используя существующие функции в пользовательском интерфейсе GNOME.