Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 查找匹配的“时出现意外的EOF”';在尝试使用ssh设置时间时_Linux_Perl_Ssh - Fatal编程技术网

Linux 查找匹配的“时出现意外的EOF”';在尝试使用ssh设置时间时

Linux 查找匹配的“时出现意外的EOF”';在尝试使用ssh设置时间时,linux,perl,ssh,Linux,Perl,Ssh,我有一个perl脚本,它通过SSH在一些PC上远程运行命令。因此,我想将所有PC上的时间设置为相同。PC是一个基于linux的系统,perl脚本使用另一个包含要执行的命令的.txt文件。但是当我运行perl脚本时,我得到了以下错误: Command = date --set "27 SEP 2012 19 sh: -c: line 0: unexpected EOF while looking for matching `"' sh: -c: line 1: syntax error: une

我有一个perl脚本,它通过SSH在一些PC上远程运行命令。因此,我想将所有PC上的时间设置为相同。PC是一个基于linux的系统,perl脚本使用另一个包含要执行的命令的.txt文件。但是当我运行perl脚本时,我得到了以下错误:

Command = date --set "27 SEP 2012 19

sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 1: syntax error: unexpected end of file
perl脚本工作正常,因为我尝试了另一个命令,它给出了结果。 那么是什么导致了这个错误呢

perl代码是:

#!/usr/bin/perl

open (MYFILE,'HostIPWithCmd.txt');
$i=0;
 @IPs=<MYFILE>;
 foreach (@IPs) {
chomp;
($EthIP,$Cmd)= split(":");
 if($EthIP!=~ ("#"))
 {
    push(@hostIP,$EthIP);
    push(@destCmd,$Cmd);

 }

 else
 {
   push(@hostIP,"$EthIP");
   push(@destCmd,$Cmd);
 }
}

$i=0;

foreach my $host (@hostIP)
{
   if($host !=~ ("#"))
   {

      my @cmds= split(/,/,$destCmd[$i]);
      print "\n\nCommands For $host = $destCmd[$i]\n";


   foreach my $command (@cmds)
             {
 print "\n*************************************";
 print "\nCommand = $command \n\n";
 system("ssh -o ConnectTimeout=10 $host $command");

         }

  print "\n***** End Of Host : $host  *****\n";
  print "************************************************************\n\n";
      }

 $i++;
}

提前谢谢

这很简单。这是因为在字符串的其他位置有冒号,这会导致字符串的结尾消失。声明:

($EthIP,$Cmd)= split(":");
输入:

10.20.146.97:date --set "27 SEP 2012 19:00:00"
将产生:

$EthIP = '10.20.146.97';
$Cmd   = 'date --set "27 SEP 2012 19';
拆分列表的其余部分(被丢弃)将是:

@rest = ("00", "00");
因为您在冒号上拆分
。一个简单的解决方案是有一个限制:

($EthIP,$Cmd)= split(/:/, $_, 2);  # max 2 fields
--- 但是,即使使用此修复程序,您的代码是否仍能正常工作仍值得怀疑。您的代码中有相当多的严重错误。自上而下:

  • 您不使用
    使用strict;使用警告这是一个重大错误,因为它允许您在代码中出现无声警告和打字错误(请参见下面的示例)。如果没有这两个pragma,永远不要编写perl代码
  • 使用
    open
    语句时不检查返回值,例如
    openmyfile、'HostwithIP.txt'或die$。不检查返回值将允许open无声地失败,从而导致各种各样的问题。不使用
    warnings
    不会警告您正在从一个关闭的文件句柄读取内容,并且您将整天坐在那里搔头,直到弄明白为止

  • 使用带有全局文件句柄的双参数open。您应该使用显式打开模式和词法文件句柄。例如,
    打开我的$fh,“这很简单。这是因为字符串中的其他位置有冒号,这会导致字符串结尾消失。语句:

    ($EthIP,$Cmd)= split(":");
    
    输入:

    10.20.146.97:date --set "27 SEP 2012 19:00:00"
    
    将产生:

    $EthIP = '10.20.146.97';
    $Cmd   = 'date --set "27 SEP 2012 19';
    
    拆分列表的其余部分(被丢弃)将是:

    @rest = ("00", "00");
    
    因为您是在冒号上拆分的
    。一个简单的修复方法是有一个限制:

    ($EthIP,$Cmd)= split(/:/, $_, 2);  # max 2 fields
    
    --- 但是,即使使用此修复程序,您的代码是否仍能正常工作仍值得怀疑。您的代码中存在不少严重错误。自上而下:

    • 您没有使用
      use strict;use warnings;
      这是一个重大的错误,因为它允许您在代码中出现无声警告和键入错误(参见下面的示例)。在没有这两个pragma的情况下,永远不要编写perl代码
    • 使用
      open
      语句而不检查返回值,例如
      openmyfile、'HostwithIP.txt'或die$!
      。不检查返回值将允许打开以静默方式失败,导致各种问题。不使用
      warnings
      不会警告您正在从关闭的文件句柄读取,并且您将在你弄明白之前,整天坐在那里搔头

    • 您使用带有全局文件句柄的双参数open。您应该使用显式的open模式和词法文件句柄。例如,
      open my$fh,“在日期/时间前后用单引号尝试,即,
      date--设置'2012年9月27日19:00:00'
      您的电脑是Linux--在它们上配置NTP!!!没有
      =~操作员,您需要
      ~<代码>(“#”)应为
      /#/
      ,并且
      $EthIP
      $EthIP之间没有区别
      @Paul R我现在尝试了一下,但得到了相同的错误:sh:-c:line 0:在查找匹配的“''@TLP时出现意外的EOF脚本工作正常,我尝试了命令,例如ls,我得到了结果,但问题似乎出在命令本身,而不是脚本在日期/时间前后使用单引号尝试,例如,
      date——设置“2012年9月27日19:00:00”
      您的电脑是Linux——在它们上配置NTP!!!没有
      =~操作员,您需要
      ~<代码>(“#”)应为
      /#/
      ,并且
      $EthIP
      $EthIP之间没有区别
      @Paul R我现在尝试一下,得到了相同的错误:sh:-c:第0行:在查找匹配的“''@TLP时出现意外的EOF脚本工作正常,我尝试了ls等命令,得到了结果,但问题似乎出在命令本身,而不是脚本