2011-07-20 38 views
8

Dizüstü bilgisayarımda ghc 6.12.3 ve Ubuntu 11.04 yüklü durumdayım.Haskell'de sudo komutları çalıştırın

Haskell'de bazı kabuk komutlarını alıp superuser (sudo update-manager, sudo iwlist .... gibi) olarak yürüten bir işleve sahip olmak isterim. System.Process modülünün createProcess, runInteractiveCommand gibi bazı işlevleri olduğunu biliyorum. Ancak, "sudo update-manager" gibi birleşik commnad'lar için değil, tek bir ham komut veya tek bir kabuk komutu vardır. "Sudo ..." yürütme işlevleriyle ilgili tüm deneylerim başarısız oldu. Haskell işlevimi çalıştırdığım terminalde yanıt yoktu.

Ayrıca HSH paketine de baktım. Ama bana verilen işlevlerin sudo komutları için de iyi olmadığı görünüyor.

Tahminimce "sudo update-manager" gibi komutları yürütmek iki işlem gerektirir. Biri "sudo" ve diğeri "update-manager" içindir. Bu nedenle, "createProcess" gibi işlevleri iki kez çağırmalı ve bir şekilde bunları "update-manager" için ikinci işlem "sudo" için ilk işlemden süper kullanıcı ayrıcalığına sahip olacak şekilde bağlamalıyım.

Yardım için şimdiden teşekkür ederiz!

+3

'updateManager'' sudo'.'sudo'nun argümanıdır, tüm argümanlarını okuyacaktır ve bunlardan yeni bir komut satırı yaratır. – fuz

+0

Bize göstermediğiniz kodu çalışmaz. Açıklamanızdan, işe yaramalıydı. – dave4420

+0

Muhtemelen iyi bir fikir değil. Seviye yükseltmek yerine seviyesini düşürmek daha iyidir – alternative

cevap

4

System.Process.system'i denediniz mi?

Bu benim için çalışıyor
import System.Process 

main = system "sudo update-manager" 

(GHC 7.0.3). Ayrıca, genel olarak Haskell'de betimlemek için (sudo dahil), Don Stewart'ın "Practical Haskell: scripting with types" numaralı sunumuna bakabilirsiniz.

+2

Kabuk olmadığı zaman bu başarısız olur. – fuz

+1

Sunumdaki kod şu adresten ulaşılabilir: https://github.com/mbezjak/playground/tree/master/scripting-with-types – gliptak

12

System.Process

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

readProcess çatal harici süreci readProcess deneyin işlemi sonlandırır kadar engelleme, kesinlikle onun standart çıktı okur ve çıkış dize döndürür. Böyle

Run it:

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

Bu seçenekler -S ve programla sudo yürütür. Şifreyi stdin'den okumak için -S gereklidir. Şifre bir satırsonu ile bitmelidir, bu yüzden program bir tane ekler.

+0

Teşekkürler! Benim için çalışıyor. – chenxicali

+0

@ user854259 Yanıt olarak işaretlemek için cevabımın puan sayacının altındaki işarete basabilir misiniz? Bu, hızlı bir şekilde bilmek için başkalarına çok yardımcı olur, hangi yanıtın yararlı olması muhtemeldir. Ayrıca, bana daha fazla puan verir (rep). – fuz

+0

Sadece bunu yaptım. :-) – chenxicali

8

Son paragrafı yanıtlama. sudo düzenli bir programdır, hiçbir sihir değildir. Sadece diğer programları çalıştırmak için olur. Haskell programın da öyle. Programınız sudo çalışır ve sudoupdate-manager çalışır Hayır, iki işlem oluşturmamalısınız.