
Ich hatte ursprünglich eineBeitrag über Stapelüberlauf.
Bei mir verursacht dieser Befehl weiter unten in meinem Jupyter-Notebook Fehler (ausführlich im SO-Beitrag):
! chown -R daemon:daemon elasticsearch-7.9.2
Viele dieser Ergebnisse:
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.
Das Anhängen sudo
scheint mein Problem teilweise zu beheben, da Operation not permitted
keine Anweisungen mehr angezeigt werden:
! sudo chown -R daemon:daemon elasticsearch-7.9.2
Der Traceback bleibt jedoch SubprocessError
bestehen.
Wie kann ich Python, dem Kernel oder AWS SageMaker Root-Berechtigungen erteilen?
Antwort1
Es gibt zwei Möglichkeiten, ein Programm oder Skript mit Root-Rechten auszuführen.
Führen Sie es mit : aus. Verwenden Sie
sudo
statt . Es kann hilfreich sein, es so zu konfigurieren, dass für diese bestimmte Datei kein Passwort abgefragt wird. Sie können dies tun, indem Sie eine Datei (mit beliebigem Namen) in ein Verzeichnis mit folgendem Inhalt legen :/path/to/your/script.py
sudo /path/to/your/script.py
sudo
/etc/sudoers.d
ALL ALL=(root) NOPASSWD: /path/to/your/script.py
benutze einenSetuid-Bit. Diese Methode wird hauptsächlich für Binärprogramme verwendet, da Linux aus Sicherheitsgründen bei Skripten (wie Ihrem Python-Skript) das Setuid-Bit ignoriert. Es ist jedoch möglich, das Skript über einenBinärer Wrapper, d. h. ein sehr kleines Binärprogramm, das nichts anderes tut, als das Skript aufzurufen. Dann sollten Sie
chown
Ihr Binärprogramm auf root setzen und das Setuid-Bit mit setzenchmod u+s /path/to/your/binary
. Programme mit einem Setuid-Bit werden mit den Berechtigungen ihres Besitzers ausgeführt – in diesem Fall also root.Das Wrapper-Programm kann beispielsweise in C wie folgt geschrieben werden:
#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); }
(Um ein C-Programm zu kompilieren, müssen Sie ein Paket installieren
build-essential
, da der C-Compiler unter Ubuntu nicht standardmäßig installiert ist).