Недавно я намеревался запустить команду 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
?
"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
в файл для целой сессии оболочки).в дополнение к тому, какой сказанный 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.
При выполнении 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
без любого аргумента или перенаправления ничего не сделает.
ssh-in
(или независимо от того, что Вы хотите назвать ее), затем добавьтеAllowGroups ssh-in
к sshd_config, затем добавьте соответствующих пользователей к ней (использованиеvigr
илиusermod --append --groups ssh-in $USERNAME
) – a CVn 27 November 2016 в 08:03