Perl远程操作疑问:加载环境配置与合并执行命令
问题解决方案
问题1:同一system调用加载环境并执行Python脚本
要在远程执行Python脚本前加载set_profile.sh的环境配置,你需要让远程shell先通过.(或source)加载脚本(这样环境变量会在当前shell会话生效),再执行Python脚本。通过bash -c把这两个命令打包成一个远程执行的字符串,就能在一次SSH调用里完成:
# 修正后的第三个system调用 system( 'ssh', '-q', $server, qq{bash -c ". ./set_profile.sh && $FILE2 --run"} );
- 用
&&连接两个命令,确保环境加载成功后才执行Python脚本; qq()用于处理带变量的字符串,让Perl自动替换$FILE2为对应的值。
问题2:合并三个操作到单个system调用
当然可以合并,而且合并后只需要建立一次SSH连接,效率更高。同样用bash -c把三个操作串成一个远程shell命令,用分号或&&分隔(分号表示无论前一步是否成功都继续,&&表示前一步成功才执行下一步)。修正后的完整代码如下:
my $host = 'mx4d4'; # 修正:给字符串加引号,避免Perl解析报错 my $FILE1 = 'Abc.conf'; # 分号分隔的配置文件 my $FILE2 = 'MyCode.py'; # Python脚本 sub do_operation() { my $server = "197.0.0.1"; # 合并所有远程操作到一次SSH调用 system( 'ssh', '-q', $server, qq{bash -c ' # 修改第3、4列内容 sed -i -E "/$host/s#([^;]+;[^;]+;)[^;]+;[^;]+#\\1NEWSTR;NEWSTR#" $FILE1; # 修改第4、5列内容 sed -i -E "/$host/s#([^;]+;[^;]+;[^;]+;[^;]+;)[^;]+;[^;]+#\\1NEWSTR;NEWSTR#" $FILE1; # 加载环境配置并执行Python脚本 . ./set_profile.sh && $FILE2 --run '} ); }
- 注意转义:Perl字符串里的
\要写成\\,避免被Perl提前解析; - 所有变量(
$host、$FILE1、$FILE2)会被Perl提前替换,再传递给远程shell执行。
内容的提问来源于stack exchange,提问作者LearningCpp
相关产品推荐
相关产品推荐

