2012-06-15 36 views
41

Tôi có một kịch bản bash, mà tôi chạy như thế này thông qua dòng lệnh:Run Bash lệnh từ PHP

./script.sh var1 var2 

Tôi cố gắng để thực hiện lệnh trên, sau khi tôi gọi một file php nào đó.

Những gì tôi có ngay bây giờ là:

$output = shell_exec("./script.sh var1 var2"); 
echo "<pre>$output</pre>"; 

Nhưng nó doesn't làm việc. Tôi đã thử nó bằng cách sử dụng execsystem quá, nhưng kịch bản không bao giờ được thực hiện.

Tuy nhiên khi tôi cố gắng chạy shell_exec("ls"); nó hoạt động và $output là danh sách tất cả các tệp.

Tôi không chắc chắn điều này là do giới hạn của VPS tôi đang sử dụng hoặc nếu vấn đề ở một nơi khác?

+1

Bạn đang chạy đường dẫn nào? 'pwd' return? – alex

+1

Tập lệnh của bạn có thể thực thi bởi người dùng «apache' hoặc' www-data' không? – core1024

+2

Đó có phải là tập lệnh bash trong cùng thư mục với tập lệnh PHP của bạn không? Thư mục làm việc của tập lệnh php có cùng thư mục không? –

Trả lời

58

Bạn có thể cần phải chdir vào đúng thư mục trước khi gọi tập lệnh. "trong" trước khi gọi lệnh shell.

$old_path = getcwd(); 
chdir('/my/path/'); 
$output = shell_exec('./script.sh var1 var2'); 
chdir($old_path); 
+0

Tôi nghĩ rằng điều này đã làm các trick! Ít nhất tôi đã làm cho nó hoạt động với một kịch bản thử nghiệm đơn giản. Để cuối cùng xác minh nó, tôi phải đợi cho máy chủ hoster để cho tôi biết đường dẫn chính xác đến các tập lệnh. Tôi sẽ đánh dấu câu trả lời ngay bây giờ. Cảm ơn! – Andrej

+0

@Andrej: Hoặc sử dụng đường dẫn tuyệt đối cho tập lệnh của bạn thay vì một tập lệnh tương đối. –

+0

@Andrej Nếu bạn đang chạy PHP 5.3, bạn có thể sử dụng 'chdir (__ DIR __)' để thay đổi thư mục vào thư mục chứa tập lệnh. Hoặc cho PHP 5.2 trở xuống, 'dirname (__ FILE __)' sẽ thực hiện thủ thuật. –

5

Shell_exec của bạn được thực thi bởi người dùng www-data, từ thư mục của nó. Bạn có thể thử

putenv("PATH=/home/user/bin/:" .$_ENV["PATH"].""); 

đâu kịch bản của bạn nằm ở /home/user/bin Sau đó bạn có thể

$output = "<pre>".shell_exec("scriptname v1 v2")."</pre>"; 
echo $output; 

Để hiển thị đầu ra của lệnh. (Ngoài ra, không xuất đường dẫn, hãy thử đưa toàn bộ đường dẫn của tập lệnh thay vì chỉ ./script.sh

+0

Không cần thiết phải thay đổi biến môi trường 'PATH'. Thay vào đó, thư mục làm việc hiện tại sẽ được thay đổi (xem [câu trả lời của tôi] (http://stackoverflow.com/a/11052453/24950)). –

+1

Đúng. Cảm ơn. Tôi đã sử dụng các thiết lập đường dẫn trong mã của tôi bởi vì tôi có nhiều tùy chỉnh thực thi khác nhau ở nhiều vị trí và tôi muốn hộp nhập liệu hoạt động như một giao diện điều khiển, vì vậy tôi có thể gọi bất kỳ lệnh nào từ các lệnh đó. Nếu nó được sử dụng chỉ để thực thi một tệp, chúng ta có thể sử dụng shell_exec ('/ entire/path/to/file /'); – Hrishikesh

0

Kiểm tra nếu chưa đặt open_basedir trong php.ini hoặc .htaccess của miền gì bạn sử dụng. điều đó tạo ra tù bạn trong thư mục của miền và php của bạn sẽ chỉ nhận được truy cập để thực hiện bên trong thư mục này

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