2010-08-06 33 views
21

Bir komut dosyasının ortasında kullanıcıyı değiştirebilir miyim?Bir bash komut dosyasının ortasında 'su' çalıştırabilir miyim?

if [ "$user" == "" ]; then 
    echo "Enter the table name"; 
    read user 
fi 

gunzip * 
chown postgres * 
su postgres 
dropdb $user 
psql -c "create database $user with encoding 'unicode';" -U dbname template1 
psql -d $user -f *.sql 
+0

olası yinelenen [I su o kullanıcı olarak bash script kalanını yürütmek için nasıl kullanırım?] (Http://stackoverflow.com/questions/1988249/how-do- i-use-su-to-the-the-the-the-use-of-the-bash-betik-kullanıcı-kullanıcı olarak) –

cevap

37

Bunu yapabilirsiniz, ancak bash, sonraki komutları postgres olarak çalıştırmaz. Bunun yerine, yapın:

su postgres -c 'dropdb $user' 

-c bayrak kullanıcı olarak bir komut (man su bakınız) çalıştırır.

+0

Teşekkür ederiz @Mark Trapp – Radek

+6

Orada çift tırnak kullanmak istersiniz: su postgres -c "dropdb $ user" ' –

+1

Kapanış teklifi başka bir satıra gelirse, birden fazla satır koyabilirsiniz. Bu durumda alıntı yapmaya özen gösterin. –

4

Hayır yapamazsınız. Ya da en azından ... sulayabilirsiniz ama su sadece o noktada yeni bir kabuk açacak ve bittiğinde, senaryonun geri kalanıyla devam edecek. Etrafında

bir yolu Böyle olmaz su -c 'some command'

9

kullanmaktır. su, bir kabuk için varsayılan bir işlemi çağırır. Komut satırında, bu kabuk etkileşimli olacak, böylece komutları girebilirsiniz. Bir senaryo bağlamında, kabuk hemen bitecek (çünkü yapacak bir şeyleri olmadığı için).

su user -c command 

command ile

user olarak çalıştırılacaktır - su genellikle şifre daha az kullanıcı veya root olarak komut dosyasını çalıştırmadan ile tek durum olan başarılı olursa.

Daha iyi ve daha iyi taneli bir yaklaşım için sudo kullanın.

2

Bugün duyduğum diğer ilginç bir fikir, kök olarak çalıştırdığınızda ve komut dosyasını başka bir kullanıcı olarak çalıştırmak istediğinizde, komut dosyası üzerinde yinelenen bir çağrı yapmaktır. Aşağıdaki örneğe bakın:

ben "root" olarak senaryoyu "my_script" çalıştırıyorum ve komut kullanıcının Sen birden su gömmek için bir here document kullanabilirsiniz


#!/bin/bash 

#Script name is: my_script 

user=`whoami` 

if [ "$user" == "root" ]; then 
    # As suggested by glenn jackman. Since I don't have anything to run once 
    # switching the user, I can modify the next line to: 
    # exec sudo -u raamee my_script and reuse the same process 
    sudo -u raamee my_script 
fi 

if [ "$user" == "raamee" ]; then 
    #put here the commands you want to perform 
    do_command_1 
    do_command_2 
    do_command_3 
fi 
+1

Eğer "raamee" işinden sonra yapacak bir şeyiniz yoksa, o zaman: 'sudo -u raamee my_script' komutunu çalıştırabilirsiniz. –

+0

Zeki, ancak burada bir belge daha basittir (cevabıma bakın). –

+0

Bunun akılda tutulması gereken bir şey, sudo'd kullanıcısı (eğer root değilse) betiğin kendisini çalıştırmak için izinlere sahip olması gerektiğidir. –

13

"raamee" çalıştırmak istediğiniz betiğinizdeki komutlar:

if [ "$user" == "" ]; then 
    echo "Enter the table name"; 
    read user 
fi 

gunzip * 
chown postgres * 
su postgres <<EOSU 
dropdb $user 
psql -c "create database $user with encoding 'unicode';" -U dbname template1 
psql -d $user -f *.sql 
EOSU 
+0

Dikkatli olun, bence backtick gibi bazı karakterler, buraya bir belgeye koyarsanız kaçması gerekir. –

İlgili konular