Linux 查找匹配的“时出现意外的EOF”';在尝试使用ssh设置时间时
我有一个perl脚本,它通过SSH在一些PC上远程运行命令。因此,我想将所有PC上的时间设置为相同。PC是一个基于linux的系统,perl脚本使用另一个包含要执行的命令的.txt文件。但是当我运行perl脚本时,我得到了以下错误: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
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
- 您没有使用
这是一个重大的错误,因为它允许您在代码中出现无声警告和键入错误(参见下面的示例)。在没有这两个pragma的情况下,永远不要编写perl代码use strict;use warnings;
- 使用
语句而不检查返回值,例如open
。不检查返回值将允许打开以静默方式失败,导致各种问题。不使用openmyfile、'HostwithIP.txt'或die$!
不会警告您正在从关闭的文件句柄读取,并且您将在你弄明白之前,整天坐在那里搔头warnings
- 您使用带有全局文件句柄的双参数open。您应该使用显式的open模式和词法文件句柄。例如,
open my$fh,“在日期/时间前后用单引号尝试,即,
您的电脑是Linux--在它们上配置NTP!!!没有date--设置'2012年9月27日19:00:00'
=~代码>操作员,您需要
~代码><代码>(“#”)应为
,并且/#/
和$EthIP
@Paul R我现在尝试了一下,但得到了相同的错误:sh:-c:line 0:在查找匹配的“''@TLP时出现意外的EOF脚本工作正常,我尝试了命令,例如ls,我得到了结果,但问题似乎出在命令本身,而不是脚本在日期/时间前后使用单引号尝试,例如,$EthIP之间没有区别
您的电脑是Linux——在它们上配置NTP!!!没有date——设置“2012年9月27日19:00:00”
=~代码>操作员,您需要
~代码><代码>(“#”)应为
,并且/#/
和$EthIP
@Paul R我现在尝试一下,得到了相同的错误:sh:-c:第0行:在查找匹配的“''@TLP时出现意外的EOF脚本工作正常,我尝试了ls等命令,得到了结果,但问题似乎出在命令本身,而不是脚本$EthIP之间没有区别
- 您没有使用