Операция chown не разрешена

Операция chown не разрешена

Я сделал оригиналПост 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.

  1. запустите его с 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
    
  2. использоватьбит 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).

Связанный контент