Что делает exec?

Недавно я намеревался запустить команду pkexec, но случайно сумел запустить команду exec без параметров или аргументов. Я посмотрел на man страницах описание exec, но я все еще не представляю, что это значит:

DESCRIPTION
       The  exec() family of functions replaces the current process image with
       a new process image.  The functions described in this manual  page  are
       front-ends  for execve(2).  (See the manual page for execve(2) for fur‐
       ther details about the replacement of the current process image.)

И на самом деле описание продолжается ... Но остальная часть описания мне тоже не очень помогло ... Так что это действительно мой вопрос, что делает команда exec? И сделал ли я что-нибудь, просто выполнив это сам, без опций или аргументов, как exec? Имеет ли это какое-либо отношение к команде pkexec?

4
задан 6 September 2015 в 23:27

3 ответа

"exec() семейство функций"... является, ну, в общем, функциями. Они используются в исходном коде. Они не команды, которые будут выполняться users1. Они обычно используются программами, которые должны выполнить другого (например, сама оболочка, sudo, pkexec, и т.д.). Программа, которая звонит exec непосредственно найдет себя замененным exec'd программа, таким образом, типичное использование обычно fork и exec.

Изобретенный пример был бы похож:

$ cat foo.c 
#include <unistd.h>
int main()
{
    const char * path = "/bin/echo";
    char * args[] = {"echo", "Hello", "World!", NULL};
    execv(path, args);
}
$ gcc -o foo foo.c
$ ./foo           
Hello World!

Вы видите реальные экземпляры exec использование использования strace на различных программах, включая strace самостоятельно:

$ strace -e execve ./foo
execve("./foo", ["./foo"], [/* 52 vars */]) = 0
execve("/bin/echo", ["echo", "Hello", "World!"], [/* 52 vars */]) = 0
Hello World!
+++ exited with 0 +++

Отметьте как strace самостоятельно использование exec для вызова программы, и затем программа в свою очередь звонит exec.


1... за исключением exec встроенная оболочка, который является функцией оболочки.

exec встроенная оболочка похожа exec функции в том вызове exec с названием программы заставляет оболочку быть замененной им. Однако общее использование exec обычно для изменения или добавления дескрипторов файлов.

Другой изобретенный пример:

$ exec 3</dev/urandom
$ read -u 3 -n 10
$ echo "$REPLY" | base64 
oZN5Qsn3nAs+1GFUCg==

Вы могли бы думать, что мы могли читать в из /dev/urandom непосредственно. Да, мы могли. Однако это полезно когда:

  • мы должны читать из к нескольким дескрипторам файлов
  • мы должны заменить один или несколько стандартных дескрипторов файлов (например, отправить stdout в файл для целой сессии оболочки).
5
ответ дан 7 September 2015 в 09:27
  • 1
    Я очень предпочитаю работать с группами вместо пользователей. Создайте группу ssh-in (или независимо от того, что Вы хотите назвать ее), затем добавьте AllowGroups ssh-in к sshd_config, затем добавьте соответствующих пользователей к ней (использование vigr или usermod --append --groups ssh-in $USERNAME) – a CVn 27 November 2016 в 08:03

в дополнение к тому, какой сказанный muru, должностное лицо является ударом встроенная команда. Следующее описание копируется со страницы справочника удара (можно использовать 'удар человека' для просмотра его):

       exec [-cl] [-a name] [command [arguments]]
              If  command  is specified, it replaces the shell.  No new process is created.  The arguments become
              the arguments to command.  If the -l option is supplied, the shell places a dash at  the  beginning
              of  the  zeroth argument passed to command.  This is what login(1) does.  The -c option causes com-
              mand to be executed with an empty environment.  If -a is supplied, the shell  passes  name  as  the
              zeroth  argument  to  the  executed command.  If command cannot be executed for some reason, a non-
              interactive shell exits, unless the shell option execfail is enabled,  in  which  case  it  returns
              failure.   An  interactive shell returns failure if the file cannot be executed.  If command is not
              specified, any redirections take effect in the current shell, and the return status is 0.  If there
              is a redirection error, the return status is 1.
1
ответ дан 7 September 2015 в 09:27
  • 1
    То, что гладкий способ сделать его, @MichaelKjö rling. Я don' t имеют пользователей в моих системах кроме меня, но если я сделал, я видел этот являющийся действительно выгодным. –  27 November 2016 в 08:14

При выполнении man exec Вы встретились exec() семейство функций, которые являются в основном оберткой по execve(2) системный вызов.

exec Вы выполнились, встроенная оболочка:

$ type -a exec 
exec is a shell builtin

Теперь от help exec :

Replace the shell with the given command.

Execute COMMAND, replacing this shell with the specified program.
ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
any redirections take effect in the current shell.

Обычно новый процесс создается комбинацией fork(2)-exec() системные вызовы. Здесь fork() создаст дочерний процесс с новым PID путем дублирования родительского процесса и затем exec() заменяет дочерний процесс желаемым исполняемым файлом, который мы хотим выполнить. Например, когда мы хотим работать, исполняемый файл говорят top, вызовы оболочки fork(2), таким образом создавая дочерний процесс, который является точно тем же как оболочкой с новым PID и затем этот недавно созданный процесс заменяется /usr/bin/top использование exec() звонить.

Теперь во встроенной оболочке exec, fork() не назван, вместо этого exec() назван непосредственно, таким образом, оболочка заменяется исполняемым файлом непосредственно, и новый процесс наследует PID оболочки.

Отметьте это только exec без любого аргумента или перенаправления ничего не сделает.

1
ответ дан 7 September 2015 в 09:27
  • 1
    @bc2946088 I' m готовый держать пари, что у Вас есть много пользователей в Вашей системе кроме себя, но возможно не человек пользователи. Даже чистая установка Ubuntu (почти как любой дистрибутив Linux там возможно за исключением Linux С нуля) настраивает много сервисных учетных записей. Предоставленный тех часто don' t имеют любой настроенный действительный пароль, но Вы никогда не знаете... – a CVn 27 November 2016 в 08:16

Другие вопросы по тегам:

Похожие вопросы: