【问题标题】:Execute first part of code as root, second part as other user以root身份执行第一部分代码,以其他用户身份执行第二部分
【发布时间】:2021-01-13 08:35:25
【问题描述】:

我在让某些代码正常工作时遇到问题。我有一些交互式程序,它有两个部分要执行:

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

2 - 它必须像其他用户一样执行一些代码,用户root可以正常su进入而无需任何密码。

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

【问题讨论】:

  • sudo -u 用户命令
  • 如果交互式程序是外部执行的程序,即不是您的 Python 代码的一部分?只有一个程序吗?它需要在不同的时间获取和放弃 root 权限,还是只需要在开始时才需要一次 root 权限?
  • 交互式程序是用 python 编写的,理想情况下是同一个 python 脚本的一部分,但我可以使用包装脚本。这个交互式脚本不需要root,我只需要一开始就需要这些权限来执行chown
  • 你有密码吗?然后你可以将它包装在期望中并使用 bash 脚本启动你的 python 应用程序。
  • 这正是我最终所做的。我在 bash 中创建了一个启动器并使用 su 以其他用户身份启动 python

标签: python bash root popen


【解决方案1】:

我最终创建了一个必须以 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 选项来指示要执行哪些命令以及以哪个用户身份执行它们。

【讨论】:

    【解决方案2】:

    我认为它应该有所帮助(作为“bash”指令)。

    代码中#之后的所有内容都是我的cmets

    将代码分为两部分 - '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 - 任何参数(名称无关紧要)我们通过哪个来获取

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

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

    echo - 输出数据
    | -(管道)将输出重定向,在这种情况下,从echosudo
    -S - 会将“echo”的输出写入提示中

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

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

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

    最终代码:

    # 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...
    

    喜欢。 订阅。评论??

    【讨论】:

    • 请稍微解释一下;仅代码的答案,即使是正确的,也不能帮助 OP 找出他们做错了什么。
    • 代码注释很好,我能理解,但我同意一些书面解释对于不熟悉 bash 的人来说会很好
    • @SuperStar,尽我所能描述??
    • @JavierRieraChirivella 好的。谢谢??
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多