簡體   English   中英

在使用sudo運行的腳本中停止root

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM