2012-06-07 56 views
1

我正在使用CPAN的Perl模塊Sudo.pmSudo.pm:某些實例不起作用

這裏是我使用的代碼:

# In this two variable I'll store the object that runs sudo commands and 
# the exit status of the commands 
my ($su, $run); 

# This functions accept an object returned from sudo->run and will check 
# if there were errors running the code. 
sub check_status { 
    # Retrieving the object 
    my $run = shift; 

    if (exists($run->{error})) { 
     print "Failed.\n"; 
    } 
    else { 
     print "Done.\n"; 
    } 
} 

# This first call erase all RSA related files 
$su = Sudo->new(
       { 
        sudo => '/usr/bin/sudo', 
        username => 'root', 
        pogram => '/usr/bin/rm', 
        program_args => '-f /tmp/cvmfs_test.key /tmp/cvmfs_test.csr /tmp/cvmfs_test.crt /tmp/whitelist.test.* /tmp/cvmfs_master.key /tmp/cvmfs_master.pub' 
       } 
); 

print 'Erasing RSA keys... '; 
$run = $su->sudo_run(); 
check_status($run); 

# This instance will erase configuration files created in /etc/cvmfs/config.d 
$su = Sudo->new(
       { 
        sudo => '/usr/bin/sudo', 
        username => 'root', 
        program => '/usr/bin/rm', 
        program_args => '-f /etc/cvmfs/config.d/127.0.0.1.conf' 
       } 
); 

print 'Erasing configuration files in /etc/cvmfs/config.d... '; 
$run = $su->sudo_run(); 
check_status($run); 

# This instance will erase /tmp/cvmfs.faulty 
$su = Sudo->new(
       { 
        sudo => '/usr/bin/sudo', 
        username => 'root', 
        program => '/usr/bin/rm', 
        program_args => '-f /tmp/cvmfs.faulty' 
       } 
); 

print 'Erasing /tmp/cvmfs.faulty... '; 
$run = $su->sudo_run(); 
print $run->{stdout}; 
check_status($run); 

# This instance will erase all previous extracted repository 
$su = Sudo->new(
       { 
        sudo => '/usr/bin/sudo', 
        username => 'root', 
        program => '/usr/bin/rm', 
        program_args => '-fr /tmp/server' 
       } 
); 

print 'Erasing /tmp/server directory... '; 
$run = $su->sudo_run(); 
print $run->{stdout}; 
check_status($run); 

# This instance will run 'restarting_services.sh' 
$su = Sudo->new(
       { 
        sudo => '/usr/bin/sudo', 
        username => 'root', 
        program => 'sh', 
        program_args => "$Bin/restarting_services.sh" 
       } 
); 

print 'Restarting services... '; 
$run = $su->sudo_run(); 
check_status($run); 

有沒有誰可以給​​我解釋一下爲什麼只有一些這種情況下的作品?準確地說,第一,第二和第五例不起作用,而第三和第四例則不起作用。

我無法在STDOUT或STDERR上獲得任何輸出,並且check_status()函數總是爲所有這些函數回答'Done'。但是這只是因爲當命令不起作用時,對象完全沒有設置。

在我看來,我對所有人都使用相同的語法。 當然,我將它與一個能夠在沒有密碼的情況下運行sudo的用戶一起使用,這就是爲什麼我沒有添加該參數的原因。

非常感謝。

+1

你是說有沒有在​​命令輸出stdout或stderr? 你可以嘗試的一件事是在'$ run'哈希上的[Data :: Dumper](http://perldoc.perl.org/Data/Dumper.html)來查看它是否有任何內容。我也會做'$ su'的轉儲,看看裏面是否有任何東西。 –

+0

謝謝你的建議。現在,我放棄了,我正在使用系統調用來使用sudo,我儘快需要它。我稍後再檢查一下。 – Zagorax

回答

1

您的代碼中存在拼寫錯誤。

pogram => '/usr/bin/rm', 

應該是:

program => '/usr/bin/rm', 

大衛·W公司的調試建議是絕對噴滴...

+0

謝謝,我錯過了。但是這並不能解決問題。 – Zagorax