linux – 在使用sudo运行的脚本中停止root
有一个命令列表只有在以sudo开头时才会成功.
还有另一个命令列表,只有当用户在没有sudo的情况下运行它们时才会成功. 我想从同一个脚本执行所有这些命令. #!/usr/bin/env bash sudo sudo_command_one; sudo sudo_command_two; sudo sudo_command_three; non_sudo_command; sudo sudo_command_four; 原因是因为sudo有超时,这些命令可能需要很长时间.我不想承受偶尔重新输入sudo密码的负担.我可以无限期地延长sudo的超时时间,但如果有更简单的方法,这也是我宁愿避免的. 因此,我将像这样运行脚本: sudo ./script 但这会阻止非sudo命令工作. #!/usr/bin/env bash sudo_command_one; sudo_command_two; sudo_command_three; [turn sudo off for a moment] non_sudo_command; [ok,turn sudo back on] sudo_command_four; 不幸的是,命令的顺序不能重新排列,所以我首先运行所有sudo命令,然后是所有非sudo命令(反之亦然). 解决方法
在sudo运行的脚本中,使用:
su -c "shell command; shell command" $SUDO_USER 在该脚本中,以调用sudo的普通用户身份执行命令. 这是有效的,因为sudo将环境变量SUDO_USER设置为原始用户名. 如果您有一堆命令以原始用户身份运行,则可以使用hereis文档. 这是一个示例脚本文件作为概念证明: myscript.sh #!/bin/bash echo "Part 1" echo "now running as:" whoami echo "SUDO_USER is:" echo $SUDO_USER su $SUDO_USER <<EOF echo "Part 2" echo "now running as:" whoami echo "SUDO_USER is:" env | grep ^SUDO_USER sleep 5 EOF echo "Part 3" echo "now running as:" whoami echo "SUDO_USER is:" echo $SUDO_USER 这是sudo ./myscript.sh上的输出 Part 1 now running as: root SUDO_USER is: paul Part 2 now running as: paul SUDO_USER is: SUDO_USER=paul Part 3 now running as: root SUDO_USER is: paul 警告:对于嵌套的sudo,此技术不能很好地工作.如果sudo嵌套两次,例如 sudo su echo $SUDO_USER ---> me sudo su echo $SUDO_USER ---> root SUDO_USER将返回root,而不是原始用户名. su $SUDO_USER将继续以root身份运行.小心避免这种情况,它应该工作正常. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |