[英]Stop being root in the middle of a script that was run with sudo
有一個命令列表只有在以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身份運行。 小心避免這種情況,它應該工作正常。
這是我如何在腳本中運行它。
#! /bin/bash
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root";
exit 1;
else
NON_ROOT_USER=$(who am i | awk '{print $1}');
echo "root ran this echo.";
sudo -u $NON_ROOT_USER echo "$NON_ROOT_USER ran this echo.";
fi
sudo ./script.sh
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.