2010-08-06 29 views
21

Tôi có thể thay đổi/su người dùng ở giữa tập lệnh không?Tôi có thể chạy 'su' ở giữa tập lệnh bash không?

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

thể trùng lặp của [Làm thế nào để sử dụng su để thực hiện phần còn lại của kịch bản bash là người dùng đó?] (Http://stackoverflow.com/questions/1988249/how-do- i-use-su-to-execute-the-rest-of-the-bash-script-as-that-user) –

Trả lời

37

Bạn có thể, nhưng bash sẽ không chạy các lệnh tiếp theo dưới dạng bưu điện. Thay vào đó, làm:

su postgres -c 'dropdb $user' 

Cờ -c chạy một lệnh như là người dùng (xem man su).

+0

cảm ơn bạn @Mark Trapp – Radek

+6

Bạn muốn sử dụng dấu ngoặc kép ở đó: 'su postgres -c "dropdb $ user" ' –

+1

Bạn có thể đặt nhiều dòng nếu dấu đóng vào một dòng khác. Chăm sóc trích dẫn trong trường hợp đó. –

4

Không, bạn không thể. Hoặc ít nhất ... bạn có thể su nhưng su sẽ chỉ đơn giản là mở một vỏ mới tại thời điểm đó và khi nó được thực hiện nó sẽ tiếp tục với phần còn lại của kịch bản.

Một cách xung quanh nó là sử dụng su -c 'some command'

9

Không thích điều này. su sẽ gọi quá trình, mặc định là một trình bao. Trên dòng lệnh, shell này sẽ tương tác, vì vậy bạn có thể nhập các lệnh. Trong bối cảnh của một kịch bản, trình bao sẽ kết thúc ngay lập tức (vì nó không có gì để làm).

Với

su user -c command 

command sẽ được thực hiện như user - nếu su thành công, mà nói chung là chỉ xảy ra với người dùng bằng mật khẩu ít hoặc khi chạy các script như root.

Sử dụng sudo để có cách tiếp cận tốt hơn và chi tiết hơn.

2

Một ý tưởng thú vị khác mà tôi nghe hôm nay là thực hiện cuộc gọi đệ quy trên tập lệnh, khi bạn chạy dưới dạng gốc và bạn muốn chạy tập lệnh với tư cách người dùng khác. Xem ví dụ dưới đây:

Tôi đang chạy kịch bản "my_script" là "gốc" và muốn kịch bản để chạy như người dùng "raamee"


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

Nếu bạn không có gì để làm sau khi "raamee" làm việc, sau đó bạn có thể: 'exec sudo -u raamee my_script' - thay thế quá trình hiện tại thay vì giữ nó treo xung quanh. –

+0

Thông minh, nhưng tài liệu ở đây đơn giản hơn (xem câu trả lời của tôi). –

+0

Một điều cần ghi nhớ với điều này là người dùng sudo'd (nếu không phải root) cần phải có quyền để chạy tập lệnh. –

13

Bạn có thể sử dụng một here document để nhúng nhiều su lệnh trong script của bạn:

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

Hãy cẩn thận, tôi nghĩ rằng một số nhân vật, như backtick, cần phải được thoát nếu bạn đặt chúng trong một tài liệu ở đây. –

1

tham khảo câu trả lời trong câu hỏi dưới đây,

Bạn có thể viết giữa < < EOF và EOF như được đề cập trong câu trả lời.

#!/bin/bash 
whoami 
sudo -u someuser bash << EOF 
echo "In" 
whoami 
EOF 
echo "Out" 
whoami 

How do I use su to execute the rest of the bash script as that user?

+0

Thêm -i vào sudo để nhận môi trường của người dùng. –

Các vấn đề liên quan