以 root 身份执行第一部分代码,以其他用户身份执行第二部分

问题描述

我在使用一些代码时遇到问题。我有一些交互式程序需要执行两个部分:

1 - 它必须确保某些目录具有适当的权限。基本上是一个简单的 chown。这部分需要根据系统要求以 root 身份执行。

2 - 它必须以其他用户身份执行一些代码用户 root 通常可以在没有任何密码的情况下su进入。

我一直在尝试使用 subprocess.Popen() ,但运气不佳,有人知道如何做到这一点吗? 提前致谢!

解决方法

我认为它应该有帮助(作为“bash”说明)。

(代码中#之后的都是我的评论)

将代码分成两部分 - 用于“root”(超级用户)和 $USER(其他用户)。
检查它是否不是一个“根”;然后做点什么...

if [ $(whoami) != 'root' ]; then
  # do some $USER instructions...

$(...) - 用于运行命令的包装器
whoami - 打印有效用户 ID

ELSE(如果它是“root”)做一些超级用户指令...

else
  # do some 'root' instructions
fi # end of 'IF' condition

在 $USER ($(whoami) != 'root') 部分,需要时,以“root”权限运行此脚本。并且您可以传递参数(例如 'DO_CHOWN')作为对特定操作的调用:

sudo -s "$0" DO_CHOWN

sudo - 以超级用户身份运行命令(默认)
-s - 将保存当前脚本路径
$0 - 当前脚本,带有路径
DO_CHOWN - 我们传递给 get 的任何参数(名称无关紧要)

使用sudo后,系统会提示您输入密码才能访问。
如果您不想经常输入密码。
你可以使用这样的东西:

echo 'yourpassword' | sudo -Ss "$0" DO_CHOWN

echo - 输出数据
| -(管道)在本例中将输出从 echo 重定向到 sudo
-S - 将“echo”的输出写入提示

在 'root' (else) 部分,我们需要获取我们传递的参数 ('DO_CHOWN')。
类似的东西:

if [[ $@ =~ 'DO_CHOWN' ]]; then
  # do chown instructions...
  exit
fi

$@ - 传递给脚本的所有参数
=~ - 查找与右侧指定值的匹配项
exit - 终止进程

最终代码:

# IF not 'root'
if [ $(whoami) != 'root' ]; then
  echo 'User:' $(whoami) # show current username
  echo 'Path:' $(pwd) # show current directory of the script
  sudo -s "$0" DO_CHOWN # send 'DO_CHOWN' argument as a call for a specific action
  # THEN enter your password,OR:
  # echo 'yourpassword' | sudo -Ss "$0" DO_CHOWN # to not enter the password manually
  echo "Continue as $(whoami)..."
# IF 'root'
else
  echo 'User:' $(whoami)
  echo 'Path:' $(pwd)
  # IF get the 'DO_CHOWN' argument
  if [[ $@ =~ 'DO_CHOWN' ]]; then
    echo 'do chown instructions...'
    exit
  fi
fi

控制台输出:

User: user_name
Path: /home/user_name
[sudo] password for user_name:
User: root
Path: /home/user_name
do chown instructions...
Continue as user_name...

喜欢。 订阅。评论??

,

我最终创建了一个必须以 root 身份执行的 bash 脚本,因此它首先执行 chown,然后执行 python 位。像这样:

#!/bin/bash

chown -R user:user /path/to/change
su -c 'python3 -c "first python step; second python step"' user

我使用 su 和 python3 的 -c 选项来指示要执行哪些命令以及以哪个用户身份执行它们。