2013-07-09 116 views
0

我開發一個腳本去一個服務器,並用Perl在ssh.I服務器中複製文件登錄到遠程服務器,比執行:MKDIR不通過ssh工作

* 我($ stdout,$ stderr,$ exit)= $ ssh-> cmd(「mkdir $ destFolder」& &「exit」); *

但MKDIR如果之後沒有命令。(我想拉幅機代碼hereo使用& &使用一堆commnads在同一個會話)

感謝。這裏是我的代碼纔有效。

####################################################################### 
# Perl Module Included 
####################################################################### 
$|=1; 

use warnings; 
use Net::SSH::Perl; 
use Net::SSH::Expect; 

####################################################################### 
# quit unless we have the correct number of command-line args 
####################################################################### 

$num_args = $#ARGV + 1; 
if ($num_args != 4) { 
    print "\nNOT ENOUGH ARGUEMENTS!\n"; 
    print "\nUSAGE:\nperl perl.pl yearMonthDay startTime endTime enodeB\n"; 
    print "\nFOR EXAMPLE:\nperl perl.pl 20130806 1530 1545 001007_eNB \n"; 
    exit; 
} 

####################################################################### 
# saving the arguments for future use . 
####################################################################### 

$date=$ARGV[0]; 
$startTime=$ARGV[1]; 
$endTime =$ARGV[2]; 
$enb =$ARGV[3]; 

####################################################################### 
# Intializing username , password and IP 
####################################################################### 

my $user = 'ejadeln'; 
my $pass = '[email protected]'; 
my $ip = '10.118.124.21'; 


####################################################################### 
# Intializing logPath , fileName and hostPath 
####################################################################### 

my $path = "/var/opt/ericsson/nms_umts_pms_seg/segment1/XML/SubNetwork=ONRM_ROOT_MO_R/MeContext="."$enb/"; 
my $endTime_t = $endTime; 
my $host = "/home/$user"; 
my $destId = "$enb.$date.$startTime"; 
my $destFolder = "/home/$user/"."$destId"; 
print "$destFolder\n"; 


for ($i = 0 ; $startTime < $endTime_t ; $i++) 
{ 
    $endTime = $startTime + 15; 
    $ofEndTime = substr($endTime, -2); 

     if ($ofEndTime >= 60) { 
      $endTime = $endTime - $ofEndTime + 100; 
     } 

    our $file = "A"."$date."."$startTime"."-0400-$endTime-0400_SubNetwork=ONRM_ROOT_M'O,MeContext="."$enb"."_eNB_statsfile.xml"; 

    $startTime = $startTime + 15; 
    $ofStartTime = substr($startTime, -2); 
     if ($ofStartTime >= 60) { 
      $startTime = $startTime - $ofStartTime + 100; 
     } 

} 
####################################################################### 
# using ssh commands to log in into remote server 
####################################################################### 

my $ssh = Net::SSH::Perl->new($ip); 

$ssh->login("$user","$pass"); 

####################################################################### 
# Implementing copy commands on remote server using SSH 
####################################################################### 

my ($stdout,$stderr,$exit) = $ssh->cmd("mkdir $destFolder" && "exit"); 


$fileNum = $i+1; 
print "$fileNum file copied\n"; 

回答

3

我相信你的意思做

$ssh->cmd("mkdir $destFolder && exit"); 

"mkdir $destFolder && exit"返回字符串mkdir /foo/bar && exit

"mkdir $destFolder" && "exit"返回字符串exit(因爲&&的LHS總是如此)。

但這也是越野車。考慮如果$destFolder包含空格或&會發生什麼情況。它應該是:

use String::ShellQuote qw(shell_quote); 
$ssh->cmd('mkdir '.shell_quote($destFolder).' && exit'); 
0

如果你的唯一要求是訪問文件系統,你可以使用SFTP:

use Net::SFTP::Foreign; 

my $sftp = Net::SFTP::Foreign->new($ip, 
            user => $user, 
            password => $pass, 
            autodie => 1); 
$sftp->mkdir($destFolder);