You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl如何解析CSV并将节点名填入system命令对应位置批量执行

解决方案

结论

可以实现,现有代码仅完成了CSV文件读取逻辑,补充遍历解析节点名、动态构造命令参数的逻辑即可达到需求。

修改步骤

  • 遍历读取到的CSV每行数据,先去除每行末尾的换行符,若CSV包含表头可跳过首行
  • 用Perl字符串插值将节点名动态替换到node=的参数位置
  • 逐行调用system执行构造好的命令即可

最简修改后代码(适用于CSV每行仅存一个节点名的场景)

#!/usr/bin/perl
use strict;
use warnings;
use POSIX qw(strftime);

# 批量将节点设为未激活状态
my $inputfile = "/home/nmis/InactiveNodes.csv";
open(INPUT,'<',$inputfile) or die $!;
my @data = <INPUT>;
close INPUT; # 读完文件及时关闭句柄

foreach my $line (@data) {
    chomp $line; # 去掉行尾换行符
    next if $line =~ /^\s*$/; # 跳过空行
    # 若CSV包含表头,可添加下面这句跳过首行:next if $. == 1;
    # 动态构造执行命令
    my $cmd = "/usr/local/nmis9/admin/node_admin.pl act=set node=$line entry.activated.NMIS=0 entry.activated.opConfig=0 entry.activated.opEvents=0 &";
    system($cmd);
}

注意事项

  • 如果你的CSV为多列格式,建议使用Text::CSV模块解析节点名,避免手动拆分出现异常,示例逻辑如下:
    # 加载模块前需先安装:cpanm Text::CSV
    use Text::CSV;
    my $csv = Text::CSV->new({ binary => 1, auto_diag => 1 });
    open my $fh, "<", $inputfile or die $!;
    # 假设第一列是节点名
    while (my $row = $csv->getline($fh)) {
        my $nodename = $row->[0];
        # 后续执行system逻辑同上
    }
    close $fh;
    
  • 若不需要后台异步执行命令,可去掉命令末尾的&符,等待单节点命令执行完成后再处理下一个节点。
  • 若节点名包含空格、特殊符号,建议使用列表形式的system调用规避shell注入风险,写法示例:
    system('/usr/local/nmis9/admin/node_admin.pl', 
      'act=set', 
      "node=$line", 
      'entry.activated.NMIS=0',
      'entry.activated.opConfig=0',
      'entry.activated.opEvents=0',
      '&'
    );
    

内容的提问来源于stack exchange,提问作者Calarian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:57:04