2011-07-20 25 views
8

Tôi đang cài đặt ghc 6.12.3 và Ubuntu 11.04 trên máy tính xách tay của mình.Chạy lệnh sudo trong Haskell

Tôi muốn có một hàm thực hiện một số lệnh shell và thực thi chúng như superuser (như sudo update-manager, sudo iwlist ....) trong Haskell. Tôi biết rằng mô-đun System.Process có một số chức năng như createProcess, runInteractiveCommand. Nhưng có cho một lệnh thô duy nhất hoặc một lệnh shell đơn, không cho các dấu phẩy phức tạp như "sudo update-manager". Tất cả các thử nghiệm của tôi về các chức năng đó để thực thi "sudo ..." đều thất bại. Các thiết bị đầu cuối tôi sử dụng để chạy chức năng haskell của tôi không có phản ứng.

Tôi cũng đã xem gói HSH. Nhưng có vẻ như với tôi rằng các hàm được xuất khẩu cũng không tốt cho các lệnh sudo.

Đoán của tôi là thực hiện các lệnh như "sudo update-manager" yêu cầu hai quy trình. Một là dành cho "sudo" và một là "update-manager". Vì vậy, tôi cần phải gọi các chức năng như "createProcess" hai lần và bằng cách nào đó kết nối chúng để quá trình thứ hai cho "update-manager" nhận đặc quyền superuser từ quá trình đầu tiên cho "sudo".

Cảm ơn bạn đã trợ giúp!

+3

'updateManager' là đối số' sudo'.'sudo' sẽ đọc tất cả các đối số của nó và tạo một dòng lệnh mới trong số chúng. – fuz

+0

Hiển thị cho chúng tôi mã bạn đã thử không hoạt động. Từ mô tả của bạn, nó phải có tác dụng. – dave4420

+0

Thats có lẽ không phải là một ý tưởng tốt. Tốt hơn là để giảm mức độ của bạn thay vì nâng nó – alternative

Trả lời

4

Bạn đã thử System.Process.system chưa?

import System.Process 

main = system "sudo update-manager" 

Điều này phù hợp với tôi (GHC 7.0.3). Ngoài ra, đối với kịch bản trong Haskell nói chung (sudo bao gồm), bạn có thể có một cái nhìn tại một bài thuyết trình "Practical Haskell: scripting with types" bởi Don Stewart.

+2

Điều này không thành công khi không có vỏ. – fuz

+1

Mã từ bản trình bày có sẵn tại https://github.com/mbezjak/playground/tree/master/scripting-with-types – gliptak

12

Hãy thử readProcess từ System.Process

readProcess :: FilePath -- command to run 
-> [String]    -- any arguments 
-> String    -- standard input 
-> IO String   -- stdout 

readProcess dĩa một quá trình mở, đọc đầu ra tiêu chuẩn của nó chặt chẽ, ngăn chặn cho đến khi quá trình này kết thúc, và trả về chuỗi đầu ra.

Run nó như thế này:

readProcess "/usr/bin/sudo" ("-S":someProgram) (passwort++"\n") 

này thực thi sudo với các tùy chọn -S và chương trình. -S là cần thiết để đọc mật khẩu từ stdin. Mật khẩu phải kết thúc bằng một dòng mới, vì vậy chương trình sẽ thêm một dòng.

+0

Cảm ơn! Nó làm việc cho tôi. – chenxicali

+0

@ user854259 Bạn có thể nhấn vào dấu chọn bên dưới bộ đếm điểm của câu trả lời của tôi để đánh dấu nó là được chấp nhận không? Điều này rất hữu ích để người khác biết nhanh, câu trả lời nào có thể hữu ích. Ngoài ra, nó mang lại cho tôi một số điểm (rep). – fuz

+0

Chỉ cần làm điều đó. :-) – chenxicali

8

Trả lời đoạn cuối cùng. sudo là một chương trình thông thường, không có phép thuật nào. Nó chỉ xảy ra để chạy các chương trình khác. Vì vậy, chương trình Haskell của bạn. Chương trình của bạn chạy sudosudo chạy update-manager Vì vậy, không, bạn không nên tạo hai quy trình.

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