[英]script does not switch to another user
我正在處理一個腳本,該腳本在某個時候需要切換到root用戶(執行“ sudo rootsh”是在我們的服務器上切換到root的唯一可接受的方法),之后它將執行某個命令。
我不確定我缺少什么,但是當腳本應該切換到root並繼續與啟動腳本的用戶執行命令時,腳本只是忽略了該部分。
如果您檢查生成的whoami.txt
文件,您將注意到該用戶不是root用戶。 請記住,執行sudo rootsh命令時,執行腳本的用戶可以切換到root用戶而沒有任何問題。
這是我正在使用的代碼:
import subprocess
def switch_user():
commands = '''
sudo rootsh
whoami > whoami.txt
sysctl -a | grep kernel.msgmni'''
process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
out, err = process.communicate(commands.encode('utf-8'))
switch_user()
知道我在做什么錯嗎? 謝謝。
代替Popen
荷蘭國際集團的子進程來運行bash
,並從打開一個單獨的特權殼, Popen
命令sudo rootsh
直接。 如果成功(要求允許用戶在不提供密碼的情況下對sudo rootsh
進行許可),則通過與子sudo rootsh
進行通信來傳遞其余命令。
遵循以下原則:
import subprocess
def switch_user():
# These shell commands will be used as input to the root shell
commands = '''whoami > whoami.txt
sysctl -a | grep kernel.msgmni'''
# Launch the root shell
process = subprocess.Popen('/usr/bin/sudo rootsh',
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
# Send the shell's input to it and receive back its output
out, err = process.communicate(commands.encode('utf-8'))
switch_user()
您可能需要針對自己的目的對其進行修改。 特別是,如果您的sudo
命令位於其他位置,那么您可能需要修改其路徑。 我再次強調,這種方法取決於能否獲得root shell而無需提供密碼。 可以通過這種方式配置Sudo,但這不是默認值。
在與操作系統團隊的成員進行了更徹底的調查之后,我終於設法完成了這項工作。 我將發布此消息,也許將來對某人有用:
import os
os.system("sudo rootsh -i -u root 'sysctl -a | grep kernel.msgmni' > parameter_value.txt")
關鍵是插入-i
和-u
選項:
-i [命令]
-i
(模擬初始登錄)選項將由目標用戶的密碼數據庫條目指定的外殼作為登錄外殼運行。 這意味着Shell將讀取特定於登錄的資源文件,例如.profile
或.login
。 如果指定了命令,則通過外殼的-c
選項將其傳遞到外殼以執行。 如果未指定命令,則執行交互式外殼程序。sudo
嘗試在運行外殼程序之前更改為該用戶的主目錄。 安全策略應將環境初始化為最少的變量集,類似於用戶登錄時出現的變量sudoers(5)
手冊中的“ 命令環境”部分記錄了-i
選項如何影響命令所在的環境。在使用sudoers
策略時運行。
-u用戶
-u
(用戶)選項使sudo
以root以外的用戶身份運行指定的命令。 要指定uid而不是用戶名,請#uid
。 當將命令作為uid運行時,許多shell要求使用反斜杠('\\
')對#
進行轉義。 安全策略可能會將uid限制為密碼數據庫中列出的uid。 只要未設置targetpw
選項,sudoers
策略就允許不在密碼數據庫中的targetpw
。 其他安全策略可能不支持此功能。
謝謝大家的答案 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.