2012-06-14 23 views
5

chương trình của tôi đang chạy trên Ubuntu 10.04, và đây là mã:Java Runtime exec ném không có tập tin hoặc cho phép từ chối

Process process=Runtime.getRuntime().exec("ls",null,null); 

nó ném một ngoại lệ của:

Cannot run program "ls": java.io.IOException: error=2, No such file or directory, 

và tôi đã cố gắng để thay đổi "ls" thành "chmod", "pwd", tôi thấy không có lệnh shell nào hoạt động, tất cả đều đến cùng một vấn đề. (Tôi cũng đã thử "/ bin/sh -c ls")

và sau đó tôi thay đổi mã thành:

Process process=Runtime.getRuntime().exec("/bin/ls",null,null); 

nó ném một ngoại lệ của: đặc quyền

Cannot run program "/bin/ls": java.io.IOException: error=13, Permission denied 

Tôi đã thay đổi tất cả các tập tin và thư mục có liên quan đến 777 vì vậy tôi thực sự không biết những gì xảy ra với nó.

Cảm ơn bạn đã trả lời.

Trả lời

2
Process process=Runtime.getRuntime().exec("ls",null,null); 

này dự kiến ​​sẽ đưa ra một ngoại lệ No such file or directory từ ls rất có thể không có trong thư mục làm việc hiện tại của chương trình của bạn. Khi bạn nhập ls từ dấu nhắc trình bao Linux, nó sử dụng biến môi trường PATH để biến ls thành /bin/ls. Runtime không làm điều này cho bạn.

Bạn cần chỉ định đường dẫn đầy đủ "/bin/ls". Như @Ernest đã đề cập, bạn nên sử dụng phương thức Runtime.exec("/bin/ls") và không chuyển qua đối số null.

Process process=Runtime.getRuntime().exec("/bin/ls"); 

Nhận xét của bạn dường như chỉ ra rằng ngay cả khi bạn sử dụng cuộc gọi này, bạn sẽ nhận được một ngoại lệ Permission denied. Điều này làm việc cho tôi từ một thực thi Java chuẩn. Tôi cho rằng bạn có thể thực hiện một số /bin/ls từ dòng lệnh Linux thành công? /bin/ls (và các thư mục liên quan) phải là 755 và không phải 777 sẽ là một cơn ác mộng về bảo mật. Nhưng 777 sẽ hoạt động.

Có thể bạn đang chạy một số loại JDK được bảo vệ? Ví dụ, các applet không có quyền thực hiện các lệnh Unix vì lý do bảo mật. Có thể bạn có một hạn chế Java policy file và bạn cần thêm quyền execute?

+0

Cảm ơn bạn đã trả lời, tôi thấy lý do là trình biên dịch tích hợp nhật thực của tôi không phải là tiêu chuẩn sun-jdk, nó mở jdk, bây giờ tôi sử dụng kiến ​​để biên dịch chương trình của tôi với sun-jdk-javac, được rồi, cảm ơn bạn rất nhiều. – libing

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