
Eu tinha feito um originalPostagem Stack Overflow.
Eu tenho este comando causando erros mais abaixo no meu Jupyter Notebook (detalhado na postagem do SO):
! chown -R daemon:daemon elasticsearch-7.9.2
Fornecendo muitos desses resultados:
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.
Anexar sudo
parece corrigir parcialmente meu problema, pois Operation not permitted
as declarações não aparecem mais:
! sudo chown -R daemon:daemon elasticsearch-7.9.2
No entanto, o SubprocessError
rastreamento permanece.
Como posso conceder permissões de root ao Python, ao kernel ou ao AWS SageMaker?
Responder1
Existem duas possibilidades para executar um programa ou script com permissões de root.
execute-o com
sudo
: em vez de/path/to/your/script.py
, usesudo /path/to/your/script.py
. Pode ser útil configurarsudo
para que não solicite senha para este arquivo específico. Você pode fazer isso colocando um arquivo (com qualquer nome) em/etc/sudoers.d
um diretório com o seguinte conteúdo:ALL ALL=(root) NOPASSWD: /path/to/your/script.py
use umbit setuid. Este método é usado principalmente para programas binários, porque para scripts (como o script Python), o Linux, por motivos de segurança, ignora o bit setuid. No entanto, é possível executar o script através de umwrapper binário, ou seja. programa binário muito pequeno que nada mais faz do que chamar o script. Então você deve
chown
fazer root no seu programa binário e definir o bit setuid usandochmod u+s /path/to/your/binary
. O programa com um bit setuid é executado com permissões de seu proprietário - ou seja. neste caso raiz.O programa wrapper pode ser escrito, por exemplo, em C, assim:
#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); }
(para compilar um programa C, você precisa instalar
build-essential
o pacote, pois o compilador C não é instalado por padrão no Ubuntu).