2012-10-17 20 views
3

我可以從命令行運行Perl腳本時沒有任何問題,但是當我嘗試使用Windows任務管理器(64位Windows 2008 Server)自動執行此任務時, SSH/SSH2的輸出不能寫入outfile。這是一個Perl腳本,它確實是這樣的:Perl腳本調用ssh2命令無法在windows任務調度程序中返回輸出

my $DB_FILE1=$PATH . "\\FSBusinessUtil_" . $hostfqdn . $DATE; 
open(OUTFILE, ">$DB_FILE1")  or die "Could not open data file "; 
print OUTFILE "FilesystemInfo\n"; 

my $output1=`$SSH_PATH\\ssh $user\@$hostname NAS_DB=/nas /nas/bin/./nas_fs -list`; 

if($? != $RC_OK){ 
    open(OUT1FILE, ">$PATH\\errFSBusinessUtil_$hostfqdn$DATE"); 
    print OUT1FILE localtime(time) . " Remote ssh failed to create $DB_FILE1. Error: $output1\n"; 
    close OUT1FILE; 
} 
else { 
    $output1=~ s/%%%/\n/g; 
    print OUTFILE $output1; 
} 
close OUTFILE; 

的Perl腳本本身得到了由Windows任務計劃程序調用,但在輸出文件中,我看到的是「FilesystemInfo」行腳本打印在調用ssh命令之前退出。除此之外,該命令確實失敗了,因爲我看到了生成的錯誤文件。但仍然,$ output1是空的,所以只有「遠程SSH無法創建...錯誤:」。

+1

我會開始調試它打印出完整的ssh命令,然後再運行它以查看它是否全部正確。我也懷疑任務管理器可能無法像你一樣訪問相同的ssh密鑰或ssh代理。作爲一個附註,使用[詞法文件句柄](http://perldoc.perl.org/functions/open.html)進行研究,你就不會遇到那種你必須解決的衝突。非常混亂的名字。 – Schwern

+0

只需注意:正斜線可用於Windows中的所有路徑名稱,這被認爲是一種更好的做法,因爲它可以減少字符逸出的混淆。 – dan1111

回答

0

通常會出現這種問題,因爲手動運行程序時以及從調度程序運行時使用的環境不同。因爲它將用戶和主機密鑰存儲在用戶文件夾中的文件中,所以它特別明智。

你應該嘗試的第一件事就是從你的腳本在調試模式下運行ssh:

ssh -vvv ... 

另一種可能性是使用Net::SSH2不從環境中使用的任何信息,因此,不會受那種問題。

+0

非常感謝您的意見。我確實嘗試了「ssh -vvv」,但我沒有在$ output1中獲得任何輸出。我嘗試着使用「Perl script_name> an_output_file方法,但它不工作,任務是以同一用戶身份運行的,我們嘗試以」SYSTEM「身份運行,並且看到您提到的有關用戶和主機的問題關鍵,我想這裏的問題是如何從命令返回的stderr輸出在我們可以看到的反引號處。謝謝! –

+0

@Libby Shen:使用類似'ssh -vvv ... 2> c:\\ stderr .out' – salva

+0

Mystry解決了!在Windows任務計劃程序中,選中了「以最高權限運行」,並干擾了SSH。一旦未選中,Perl腳本就順利執行。 –

0

我在計劃的VBscript中運行SCP和SSH時遇到了類似的問題。覈對「以最高權限運行」的伎倆。

相關問題