gpt4 book ai didi

linux - 在尝试使用 ssh 设置时间时寻找匹配的 `"时出现意外的 EOF

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:32 24 4
gpt4 key购买 nike

我有一个 perl 脚本,可以通过 SSH 在某些 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++;
}

和 HostIPWithCmd.txt

   10.20.146.97:date --set "27 SEP 2012 19:00:00"

提前致谢。

最佳答案

这很简单。这是因为您的字符串中的其他地方有冒号,这会导致字符串的末尾消失。声明:

($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;这是一个主要错误,因为它会让您在代码中出现静默警告和拼写错误(参见下面的示例)。没有这两个编译指示,切勿编写 perl 代码。
  • 您使用 open声明而不检查返回值,例如open MYFILE, 'HostwithIP.txt' or die $! .不检查返回值将允许打开无声地失败,导致各种麻烦。不使用 warnings不会警告您正在从一个关闭的文件句柄中读取数据,在您弄明白之前,您会坐在那里挠头一整天。
  • 您使用带有全局文件句柄的两个参数打开。您应该使用显式打开模式和词法文件句柄。例如。 open my $fh, "<", 'HostIPWithCmd.txt" or die $! .
  • 您正在使用 foreach (@IP)而不是简单地遍历文件句柄,例如while (<MYFILE>)
  • split使用正则表达式,而不是字符串。它会将字符串转换为正则表达式,但最好从一开始就将其转换为正则表达式。 split /#/ .
  • 没有 !=~运算符(operator)。它将被解释为 $foo != ~ $bar ,或者换句话说,$foo 之间的数值不等式检查和 $bar 的按位求反.您想要的运算符是 !~ .这个特殊的东西会将你的代码分成很多小块,尤其是当你不使用 warnings 时。 ,并且错误是无声的。所以不,正如您在评论中所说,您的脚本工作完美,它被严重破坏了。你只是看不到它,因为你不使用 warnings .
  • 你的 if-else 语句完全是多余的,因为同样的事情发生在 if 和 else 子句中。 $EthIP之间没有区别和 "$EthIP" .两者完全相同。这可能是您认为您的代码有效的原因。

此外,当使用 system 时, 反引号或 qx()考虑其他方法来解决问题总是一个好主意。有些模块可以比 system 更好地为您处理这个问题.

关于linux - 在尝试使用 ssh 设置时间时寻找匹配的 `"时出现意外的 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12627193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com