it-swarm.dev

كيفية تنفيذ مجموعة من الأوامر كمستخدم آخر في 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"

... لأن الأوامر نفسها تحتوي على علامات اقتباس.

ما هي الطريقة الصحيحة "لتجميع" الأوامر وتشغيلها تحت حساب مستخدم آخر؟

62
Nathan Osman

جرب هذا:

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

<< يقدم here-doc . الرمز المميز التالي هو المحدد ، ويتم تغذية كل شيء حتى سطر يبدأ بـ المحدد كمدخل قياسي في الأمر. وضع المحدد في علامات اقتباس مفردة يمنع الاستبدال المتغير داخل المستند doc.

142
Barmar

لست رائعًا مع bash-foo ، لذا لا بد أن تكون طريقة أكثر أناقة ، لكني تعاملت مع هذه المشكلة في الماضي باستخدام برامج نصية متعددة و "برنامج تشغيل"

مثلا.

Driver

#!/bin/bash
set -e

su root script1
su somebody script2

Script1

#!/bin/bash
set -e

root_command -p param1  # run as root

Script2

#!/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'
7
stefancarlton

يتحقق هذا البرنامج النصي إذا كان المستخدم الحالي الذي يقوم بتشغيل البرنامج النصي هو المستخدم المطلوب. إذا لم يكن كذلك ، فسيتم إعادة تنفيذ البرنامج النصي مع المستخدم المطلوب.

#!/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
0
swift_dodo