Переключение на пользователя root внутри сценария оболочки

У меня есть сценарий оболочки, которому нужна учетная запись пользователя без полномочий root для запуска определенных команд, а затем измените пользователя на root для запуска остальной части сценария. Я использую SUSE11. Я использовал ожидать, чтобы автоматизировать запрос пароля. Но когда я использую spawn su - и команда выполняется, приглашение возвращается с root, а остальная часть сценария не выполняется.

Например.

< non-root commands>
 spawn su -
<root commands>

Но после su - приглашение возвращается обратно с пользователем как root. Как выполнить оставшуюся часть сценария.

Параметр sudo -S не помогает, так как он не запускает команду sudo -S ifconfig, в которой мне нужно найти IP-адрес компьютера.

Я уже прошел по этим ссылкам, но не смог найти решение: Измените каталог сценария на домашний каталог пользователя в сценарии оболочки

Изменение пользователя unix в скрипте оболочки

6 ответов

sudo здесь будет работать, но вам нужно немного изменить скрипт:

$ cat 1.sh 
id 
sudo -s <<EOF
echo Now i am root
id
echo "yes!"
EOF

$ bash 1.sh
uid=1000(igor) gid=1000(igor) groups=1000(igor),29(audio),44(video),124(fuse)
Now i am root
uid=0(root) gid=0(root) groups=0(root)
yes!

Вы должны запустить свою команду в <<EOF блокировать и дать блок sudo,

Если вы хотите, вы можете использовать su, конечно. Но вам нужно запустить его с помощью expect/pexpect это введет пароль для вас.

Но даже если вам удастся ввести пароль автоматически (или отключить его), эта конструкция не будет работать:

user-command
su 
root-command

В этом случае root-command будет выполняться с пользователем, а не с привилегиями root, потому что он будет выполнен после su будет закончено (su открывает новую оболочку, а не меняет uid текущей оболочки). Вы можете использовать тот же трюк здесь, конечно:

su -c 'sh -s' <<EOF
# list of root commands
EOF

Но теперь у вас так же, как с sudo,

Есть простой способ сделать это без второго скрипта. Просто поместите это в начало вашего файла:

if [ "$(whoami)" != "root" ]
then
    sudo su -s "$0"
    exit
fi

Тогда он автоматически запустится от имени пользователя root. Конечно, это предполагает, что вы можете sudo su без необходимости ввода пароля - но это выходит за рамки этого ответа; см. один из других вопросов об использовании sudo в сценариях оболочки, чтобы узнать, как это сделать.

Краткая версия: создайте блок для включения всех команд, которые будут запускаться от имени пользователя root.

Например, я создал скрипт для запуска команды из корневого подкаталога, сегмент выглядит так:

sudo su - <<EOF
cd rootSubFolder/subfolder
./commandtoRun
EOF

Также обратите внимание, что если вы переходите к пользователю "root" внутри сценария оболочки, как показано ниже, несколько утилит Linux, таких как awk для извлечения данных или определения даже простой переменной оболочки и т. Д., Будут вести себя странно.

Чтобы решить эту проблему, просто процитируйте весь документ, используя << 'EOF' вместо EOF.

sudo -i <<'EOF'
ls
echo "I am root now"
EOF

Самый простой способ сделать это - создать как минимум два сценария.

Первый должен вызывать второй с правами root. Таким образом, каждая команда, которую вы выполняете во втором скрипте, будет выполняться от имени пользователя root.

Например:

runasroot.sh

sudo su-c'./scriptname.sh'

scriptname.sh

apt-get install mysql-server-5.5

или что вам нужно.

Вы можете использовать эту функцию, которая снова вызовет скрипт от имени пользователя root, передав первый аргумент новому вызову:

      A=$1
run_with_sudo() {
    local prompt

    prompt=$(sudo -nv 2>&1)
    if [ $? -eq 0 ]; then
        # the current user has sudo and the password is already set
        if [ "$(whoami)" != "root" ]; then
            # restart script as root
            exec sudo su - <<EOF
                "$0" "$A"
EOF
            exit
        fi
    elif echo $prompt | grep -q '^sudo:'; then
        echo "the current user has sudo but needs the password entered"
        return 1
    else
        echo "the current user has no sudo rights"
        return 1
    fi
}

обратите внимание, что «0 долларов» может быть не тем, что вы думаете]

Другие вопросы по тегам