
Я сделал оригиналПост Stack Overflow.
У меня эта команда вызывает ошибки ниже в моем Jupyter Notebook (подробности в сообщении SO):
! chown -R daemon:daemon elasticsearch-7.9.2
Давая многие из этих результатов:
chown: changing ownership of ‘elasticsearch-7.9.2/NOTICE.txt’: Operation not permitted
...
---------------------------------------------------------------------------
SubprocessError Traceback (most recent call last)
<ipython-input-25-5f043305a2ca> in <module>
8 es_server = Popen(['elasticsearch-7.9.2/bin/elasticsearch'],
9 stdout=PIPE, stderr=STDOUT,
---> 10 preexec_fn=lambda: os.setuid(1) # as daemon
11 )
12 # wait until ES has started
~/anaconda3/envs/mxnet_latest_p37/lib/python3.7/subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text)
798 c2pread, c2pwrite,
799 errread, errwrite,
--> 800 restore_signals, start_new_session)
801 except:
802 # Cleanup if the child failed starting.
~/anaconda3/envs/mxnet_latest_p37/lib/python3.7/subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session)
1550 err_msg += ': ' + repr(err_filename)
1551 raise child_exception_type(errno_num, err_msg, err_filename)
-> 1552 raise child_exception_type(err_msg)
1553
1554
SubprocessError: Exception occurred in preexec_fn.
---------------------------------------------------------------------------
SubprocessError Traceback (most recent call last)
<ipython-input-25-5f043305a2ca> in <module>
8 es_server = Popen(['elasticsearch-7.9.2/bin/elasticsearch'],
9 stdout=PIPE, stderr=STDOUT,
---> 10 preexec_fn=lambda: os.setuid(1) # as daemon
11 )
12 # wait until ES has started
~/anaconda3/envs/mxnet_latest_p37/lib/python3.7/subprocess.py in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, encoding, errors, text)
798 c2pread, c2pwrite,
799 errread, errwrite,
--> 800 restore_signals, start_new_session)
801 except:
802 # Cleanup if the child failed starting.
~/anaconda3/envs/mxnet_latest_p37/lib/python3.7/subprocess.py in _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session)
1550 err_msg += ': ' + repr(err_filename)
1551 raise child_exception_type(errno_num, err_msg, err_filename)
-> 1552 raise child_exception_type(err_msg)
1553
1554
SubprocessError: Exception occurred in preexec_fn.
Добавление, sudo
похоже, частично решило мою проблему, поскольку Operation not permitted
утверждения больше не появляются:
! sudo chown -R daemon:daemon elasticsearch-7.9.2
Однако SubprocessError
след остается.
Как предоставить Python, ядру или AWS SageMaker права root?
решение1
Существует два способа запустить программу или скрипт с правами root.
запустите его с
sudo
: вместо/path/to/your/script.py
, используйтеsudo /path/to/your/script.py
. Это может помочь настроитьsudo
так, чтобы он не запрашивал пароль для этого конкретного файла. Вы можете сделать это, поместив файл (с любым именем) в/etc/sudoers.d
каталог со следующим содержимым:ALL ALL=(root) NOPASSWD: /path/to/your/script.py
использоватьбит setuid. Этот метод используется в основном для бинарных программ, поскольку для скриптов (например, вашего скрипта Python) Linux по соображениям безопасности игнорирует бит setuid. Однако можно запустить скрипт черездвоичная оболочка, т. е. очень маленькая бинарная программа, которая не делает ничего, кроме вызова скрипта. Затем вы должны сделать
chown
вашу бинарную программу root и установить бит setuid с помощьюchmod u+s /path/to/your/binary
. Программа с битом setuid запускается с правами ее владельца - т. е. в данном случае root.Программу-оболочку можно написать, например, на языке C, например, так:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> int main() { int rc; setuid( 0 ); rc=WEXITSTATUS(system( "/path/to/your/script.py" )); exit(rc); }
(чтобы скомпилировать программу на языке C, вам необходимо установить
build-essential
пакет, так как компилятор C по умолчанию не установлен в Ubuntu).