2011-09-14 24 views
1

我已經寫了這個Perl腳本來自動我的無線連接:Perl腳本不執行一些外部呼叫

#!/usr/bin/perl 

use strict; 

my @modes = ("start", "stop"); 
my $mode = $modes[0]; 
my $kill_command = "sudo kill -TERM "; 

sub check_args 
{ 
    if($#ARGV != 0) 
    { 
     print(STDERR "Wrong arguments\n"); 
     print(STDERR "Usage: ./wicd.pl start|stop\n"); 
     exit(); 
    } 

    my @aux = grep(/^$ARGV[0]$/, @modes); 

    if ([email protected]) 
    { 
     print(STDERR "Unknown argument\n"); 
     print(STDERR "Usage: ./wicd.pl start|stop\n"); 
     exit(); 
    } 

    $mode = $ARGV[0]; 
} 

check_args(); 

my @is_wicd_running = `ps -A | grep wicd`; 

# START 
if ($mode eq $modes[0]) 
{ 
    if ([email protected]_wicd_running) 
    { 
     system("gksudo ifconfig wlan0 down"); 
     system("sudo macchanger -r wlan0"); 
     system("sudo wicd"); 
    } 

    my @is_wicd_gui_running = grep(/wicd-client/, @is_wicd_running); 

    if ([email protected]_wicd_gui_running) 
    { 
     system("gksudo wicd-gtk &"); 
    } 
} 

# STOP 
else 
{ 
    for (@is_wicd_running) 
    { 
     my @aux = split(/ /, $_); 
     system("$kill_command$aux[1]"); 
    } 
    system("sudo ifconfig wlan0 down"); 
} 

的問題是,macchanger和須藤使用ifconfig爲wlan0下不執行(只有那些...)。奇怪的是,這些調用在通過Perl調試器(perl -d)調用腳本時執行。我認爲這可能是一個計時問題,並在這些調用之前添加了一些sleep()調用,但沒有改變。我也嘗試使用system()調用,並且沒有任何更改。

編輯:更奇怪,我發現,如果我運行腳本perl的wicd.pl其正常運行,而./wicd.pl不(它運行但上述問題) 。我附上了整個腳本。標頭上使用的Perl解釋器與perl命令返回的相同。

任何線索?提前致謝!

+0

試試我的$ out = qx(sudo ifconfig wlan0 down); – Gilbert

+0

'gksudo/sudo'提示輸入密碼? – TLP

+0

是的。如果不是這樣的話,沒有一個命令可以工作。事實上,我再次修改了腳本,刪除了所有的sudo/gksudo,並像sudo/gksudo ./wicd.pl一樣調用它,看起來更乾淨恕我直言(後面我會編輯問題)。仍是同樣的問題。 – m0skit0

回答

-1

更多信息可能會有所幫助,並確保\ n始終結束輸出行。內

 
sub runx 
{ 
    foreach my $cmd (@_) 
    { 
     my $out = qx("$cmd 2>&1"); 
     my $x = $?; 
     $out =~ s/\s*$/\n/s; 
     printf "\%s (0x\%0x):\n\%s", $cmd, $x, $out; 
     last if $x; 
    } 
return $x; 
}

沒有時間試試你的運行命令今早運行這段代碼並不能刪除我之前的評論。但有些運行「which」命令的人也可以保證你的命令在PATH上。

+0

感謝您的線索。我會試一試,但正如我之前所說的那樣,這些命令在終端上或通過Perl調試器運行良好(所以PATH問題沒有問題)。只有在像./wicd.pl這樣的腳本運行時纔會出現問題。還有更多您需要的信息? – m0skit0

+0

當我使用qx()時,我無法執行任何命令。它總是吐出*「sh:command not found」*。如果以\ n結尾或不是,則無關緊要。 – m0skit0

+0

Ok qx()需要沒有引號且沒有尾隨的命令\ n。無論如何,沒有差別,仍然是同樣的行爲 – m0skit0