不允許 chown 操作

不允許 chown 操作

我原來做了一個堆疊溢位帖子

我的這個命令在我的 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. 用一個設定用戶ID位。此方法主要用於二進位程序,因為對於腳本(例如 Python 腳本),Linux 出於安全原因忽略 setuid 位元。但是,可以透過以下方式運行腳本二進制包裝器, IE。非常小的二進位程序,除了呼叫腳本之外什麼都不做。然後你應該將chown你的二進位程式root並使用設定setuid位元chmod u+s /path/to/your/binary。具有 setuid 位元的程式以其所有者的權限運行 - 即。在這種情況下是根。

    包裝程式可以用 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軟體包,因為Ubuntu上預設不安裝C編譯器)。

相關內容