2013-07-20 16 views
55

some existing questions zaten başka bir kullanıcı olarak komutları çalıştırma hakkında burada sordu. Ancak, soru ve cevaplar, uzun bir komut grubu yerine tek bir komutla odaklanır.Bash’te başka bir kullanıcı olarak bir grup komut nasıl çalıştırılır?

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

Orada önemli noktalardan bir çift burada not etmek gibidir::

  • son üç komutları su kullanarak başka bir kullanıcı olarak çalıştırmak veya gerekir

    Örneğin, aşağıdaki komut dosyası düşünün sudo. Örnekte, üç komut vardı, ancak daha birçok şey olduğunu varsayalım ...

  • Komutların kendileri tek ve çift tırnaklardan yararlanıyor. kendileri tırnak içerirler komutları beri ...

    su somebody -c "command" 
    

    :

ikinci nokta yukarıdaki aşağıdaki sözdizimi kullanılmasını önler.

Komutları "gruplamak" ve bunları başka bir kullanıcı hesabı altında çalıştırmak için uygun yol nedir? Ben bash-foo ile büyük değilim

+1

Unix stackexchange'de herhangi bir şans var mı? – icedwater

+0

Ayrıca bkz. Http://stackoverflow.com/questions/37586811/pass-commands-as-input-to-another-command-su-ssh-sh-etc/37586820#37586820 – tripleee

cevap

125

bu deneyin:

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

<<, belgesini, belgesini tanıtır. Bir sonraki belirteç sınırlayıcıdır ve sınırlayıcıyla başlayan bir çizgiye kadar olan her şey, komut için standart girdi olarak beslenir. Sınırlayıcıyı tek tırnak içine koymak, buradaki dokümanda değişken değiştirmeyi önler.

+0

Siz, efendim, bir deha. HEREDOC kullanmayı düşündüm ama çalışmasını sağlamak için doğru sözdizimini bulamadım. Teşekkürler! –

+0

Neden -c 'bayrağı gerekli değil? -c' olmadan, izin reddedildi hatası alıyorum. – rightfold

+0

'-c', standart girdiden okunmak yerine, komut bir argüman olarak sağlandığında kullanılır. – Barmar

5

böylece daha zarif bir şekilde olmak zorundadır var ama Ör Birden fazla komut dosyası ve bir "sürücü"

kullanarak geçmişte bu sorunu yaklaştı ettik

Sürücü

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

Bu komut dosyası, komut dosyasını çalıştıran geçerli kullanıcının istenen kullanıcı olup olmadığını kontrol eder. Değilse, komut istenen kullanıcı ile yeniden yürütülür.

#!/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 
İlgili konular