2010-09-16 33 views
10

Trong tập lệnh bash của tôi, tôi thực hiện một số lệnh với tư cách người dùng khác. Tôi muốn gọi hàm bash bằng cách sử dụng su.Chạy chức năng bash theo lệnh su

my_function() 
{ 
    do_something 
} 

su username -c "my_function" 

Tập lệnh trên không hoạt động. Tất nhiên, my_function không được xác định bên trong su. Một ý tưởng tôi có là đặt hàm vào một tệp riêng biệt. Bạn có ý tưởng tốt hơn là tránh tạo tệp khác không?

Trả lời

11

Bạn có thể xuất các chức năng để làm cho nó có sẵn cho các subshell:

export -f my_function 
su username -c "my_function" 
2

Bạn có thể bật 'sudo' trong hệ thống của mình và sử dụng thay vào đó.

+0

sudo không được bật. Quản trị viên hệ thống sẽ không bật tính năng này. –

+2

Làm thế nào để bạn làm điều này với 'sudo'? một 'sudo my_function' đơn giản sẽ không hoạt động, ngay cả sau khi xuất hàm đó. – michas

1

Bạn phải có chức năng trong cùng phạm vi nơi bạn sử dụng. Vì vậy, hoặc đặt hàm bên trong dấu ngoặc kép hoặc đặt hàm vào một tập lệnh riêng biệt, sau đó bạn chạy bằng su -c.

+0

Tôi muốn gọi cùng một tập lệnh bên ngoài su. Kịch bản khác cũng là ý tưởng của tôi. –

0

Một cách khác có thể làm cho các trường hợp và đi qua một tham số để kịch bản thực thi. Ví dụ có thể là: Trước tiên hãy tạo một tệp có tên là "script.sh". Sau đó chèn mã này trong đó:

#!/bin/sh 

my_function() { 
    echo "this is my function." 
} 

my_second_function() { 
    echo "this is my second function." 
} 

case "$1" in 
    'do_my_function') 
     my_function 
     ;; 
    'do_my_second_function') 
     my_second_function 
     ;; 
    *) #default execute 
     my_function 
esac 

Sau khi thêm đoạn mã trên chạy các lệnh này để xem nó trong hành động:

[email protected]:/# chmod +x script.sh #This will make the file executable 
[email protected]:/# ./script.sh   #This will run the script without any parameters, triggering the default action.   
this is my function. 
[email protected]:/# ./script.sh do_my_second_function #Executing the script with parameter 
this function is my second one. 
[email protected]:/# 

Để thực hiện công việc này như bạn yêu cầu bạn chỉ cần chạy

su username -c '/path/to/script.sh do_my_second_function' 

và mọi thứ sẽ hoạt động tốt. Hy vọng điều này sẽ giúp :)

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