如何在Perl脚本的SCP操作中抑制SSH认证横幅输出?
解决SCP输出认证横幅的几种实用方案
针对你用Perl脚本循环执行SCP时出现的认证横幅冗余问题,给你几个直接有效的解决办法:
1. 给SCP添加SSH参数禁用横幅
SCP底层依赖SSH,直接通过-o Banner=none参数让SSH不加载认证横幅,这是最精准的方式,不会影响正常的传输提示(如果需要保留的话)。修改后的Perl代码里的命令行如下:
my $sendCommand = `scp -o Banner=none $fileToTransfer $servName[$j]:$targetLocation`;
如果连SCP的进度输出也想一起抑制,再加个-q参数(quiet模式):
my $sendCommand = `scp -q -o Banner=none $fileToTransfer $servName[$j]:$targetLocation`;
2. 重定向无关输出到/dev/null
如果不想改SSH配置或参数,直接把SCP的标准错误(横幅通常走stderr)重定向到空设备,这样冗余内容就不会被捕获输出。命令修改为:
my $sendCommand = `scp $fileToTransfer $servName[$j]:$targetLocation 2>/dev/null`;
要是横幅走的是标准输出,就把stdout也一起处理(但这样会丢失正常的SCP输出):
my $sendCommand = `scp $fileToTransfer $servName[$j]:$targetLocation >/dev/null 2>&1`;
3. 在Perl中过滤捕获的输出
如果横幅内容有固定格式(比如开头是特定字符串),可以在捕获输出后用Perl的字符串处理过滤掉。比如假设横幅以"Welcome to"开头,就这么处理:
my $sendCommand = `scp $fileToTransfer $servName[$j]:$targetLocation`; # 过滤掉包含横幅的行 $sendCommand =~ s/^Welcome to.*$//gm; print $sendCommand;
这种方式适合需要保留SCP正常输出,但只想去掉特定横幅的场景。
内容的提问来源于stack exchange,提问作者Jacob Boyce
相关产品推荐
相关产品推荐

