问题描述
我在使用一些代码时遇到问题。我有一些交互式程序需要执行两个部分:
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 选项来指示要执行哪些命令以及以哪个用户身份执行它们。