2013-07-20 5 views
55

Здесь уже есть some existing questions о том, как запускать команды в качестве другого пользователя. Тем не менее, вопрос и ответы фокусируются на одной командой вместо длинной группы команд.Как выполнить группу команд в качестве другого пользователя в Bash?

Например, рассмотрим следующий сценарий:

#!/bin/bash 
set -e 

root_command -p param1 # run as root 

# these commands must be run as another user 
command1 -p 'parameter with "quotes" inline' 
command2 -p 'parameter with "quotes" inline' 
command3 -p 'parameter with "quotes" inline' 

Там есть несколько важных моментов, чтобы отметить здесь:

  • Последние три команды должны работать в качестве другого пользователя с помощью su или sudo. В этом примере было три команды, но предположил, что их было еще много ...

  • Сами команды используют одинарные и двойные кавычки.

Второй пункт выше предотвращает использование следующего синтаксиса:

su somebody -c "command" 

... так как сами команды содержат кавычки.

Каков правильный способ «группировать» команды и запускать их под другой учетной записью пользователя?

+1

Любая удача в Unix stackexchange? – icedwater

+0

См. Также http://stackoverflow.com/questions/37586811/pass-commands-as-input-to-another-command-su-ssh-sh-etc/37586820#37586820 – tripleee

ответ

125

Попробуйте это:

su somebody <<'EOF' 
command1 -p 'parameter with "quotes" inline' 
command2 -p 'parameter with "quotes" inline' 
command3 -p 'parameter with "quotes" inline' 
EOF 

<< представляет здесь-doc. Следующий токен - это разделитель, и все до строки, начинающейся с разделителя, подается в качестве стандартного ввода команды. Помещение разделителя в одинарные кавычки предотвращает замену переменных внутри данного документа.

+0

Вы, сэр, гений. Я думал об использовании HEREDOC, но не смог найти правильный синтаксис, чтобы заставить его работать. Благодаря! –

+0

Почему флаг '-c' не нужен? Без '-c', я получаю отклоненную разрешенную ошибку. – rightfold

+0

'-c' используется, когда команда предоставляется как аргумент, а не считывается со стандартного ввода. – Barmar

5

Я не большой с Баш-обув так что есть обязан быть более элегантным способом, но я подошел к этой проблеме в прошлом с помощью нескольких сценариев и «драйвера»

Э.Г.

Driver

#!/bin/bash 
set -e 

su root script1 
su somebody script2 

script1

#!/bin/bash 
set -e 

root_command -p param1 # run as root 

Скрипт2

#!/bin/bash 
set -e 

# these commands must be run as another user 
command1 -p 'parameter with "quotes" inline' 
command2 -p 'parameter with "quotes" inline' 
command3 -p 'parameter with "quotes" inline' 
0

Этот скрипт проверяет, является ли текущий пользователь, выполняющий скрипт, желаемым пользователем. Если нет, то сценарий перезапускается с нужным пользователем.

#!/usr/bin/env bash 

TOKEN_USER_X=TOKEN_USER_X 
USER_X=peter # other user! 

SCRIPT_PATH=$(readlink -f "$BASH_SOURCE") 

if [[ "[email protected]" != "$TOKEN_USER_X" ]]; then 

    ###### RUN THIS PART AS the user who started the script 

    echo "This script is $SCRIPT_PATH" 

    echo -n "Current user: " 
    echo $USER 

    read -p "insert: " 
    echo "got $REPLY" 

    su - $USER_X -c "$SCRIPT_PATH $TOKEN_USER_X" # execute code below after else (marked #TOKEN_USER_X) 

else 
    #TOKEN_USER_X -- come here only if script received one parameter TOKEN_USER_X 

    ###### RUN THIS PART AS USER peter 

    echo 
    echo "Now this script is $SCRIPT_PATH" 

    echo -n "Current user: " 
    echo $USER 

    read -p "insert: " 
    echo "got $REPLY" 

    exit 0 
fi 

echo 
echo "Back to initial user..." 
echo -n "Current user: " 
echo $USER