在线html网站开发,模拟百度搜索词进入网站,网站设计专业需要什么软件,河南十大建筑公司排名探索 Pexpect#xff0c;第 1 部分#xff1a;剖析 Pexpect概述Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现#xff0c;是一个用来启动子程序#xff0c;并使用正则表达式对程序输出做出特定响应#xff0c;以此实现与其自动交互的 Python 模块。 Pexpect 的使…探索 Pexpect第 1 部分剖析 Pexpect概述Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现是一个用来启动子程序并使用正则表达式对程序输出做出特定响应以此实现与其自动交互的 Python 模块。 Pexpect 的使用范围很广可以用来实现与 ssh、ftp 、telnet 等程序的自动交互可以用来自动复制软件安装包并在不同机器自动安装还可以用来实现软件测试中与命令行交互的自动化。下载Pexpect 可以从 SourceForge 网站下载。 本文介绍的示例使用的是 2.3 版本如不说明测试环境默认运行操作系统为 fedora 9 并使用 Python 2.5 。安装依赖Python 版本 2.4 或者 2.5pty module pty 是任何 Posix 系统标准库的一部分由于其依赖 pty module 所以 Pexpect 还不能在 Windows 的标准 python 环境中执行如果想在 Windows 平台使用可以使用在 Windows 中运行 Cygwin 做为替代方案。遵循 MIT 许可证根据 Wiki 对 MIT License 的介绍“该模块被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软件及软件的副本。被授权人可根据程序的需要修改授权条款为适当的内容。在软件和软件的所有副本中都必须包含版权声明和许可声明。”Pexpect 提供的 run() 函数清单 1. run() 的定义函数 run 可以用来运行命令其作用与 Python os 模块中 system() 函数相似。run() 是通过 Pexpect类实现的。如果命令的路径没有完全给出则 run 会使用 which 命令尝试搜索命令的路径 。清单 2. 使用 run()执行 svn 命令与 os.system() 不同的是使用 run() 可以方便地同时获得命令的输出结果与命令的退出状态 。清单 3. run() 的返回值command_out 中保存的就是 /bin 目录下的内容。Pexpect 提供的 spawn() 类使用 Pexpect 启动子程序清单 4. spawn 的构造函数spawn是Pexpect模块主要的类用以实现启动子程序它有丰富的方法与子程序交互从而实现用户对子程序的控制。它主要使用 pty.fork() 生成子进程并调用 exec() 系列函数执行 command 参数的内容。可以这样使用清单 5. spawn() 使用示例当子程序需要参数时还可以使用一个参数的列表清单 6. 参数列表示例在构造函数中maxread 属性指定了 Pexpect 对象试图从 tty 一次读取的最大字节数它的默认值是2000字节 。由于需要实现不断匹配子程序输出 searchwindowsize 指定了从输入缓冲区中进行模式匹配的位置默认从开始匹配。logfile 参数指定了 Pexpect 产生的日志的记录位置。例如清单 7. 记录日志还可以将日志指向标准输出清单 8. 将日志指向标准输出如果不需要记录向子程序输入的日志只记录子程序的输出可以使用清单 9. 记录输出日志使用 Pexpect 控制子程序为了控制子程序等待子程序产生特定输出做出特定的响应可以使用 expect 方法。清单 10. expect() 定义在参数中 pattern 可以是正则表达式 pexpect.EOF pexpect.TIMEOUT 或者由这些元素组成的列表。需要注意的是当 pattern 的类型是一个列表时且子程序输出结果中不止一个被匹配成功则匹配返回的结果是缓冲区中最先出现的那个元素或者是列表中最左边的元素。使用 timeout 可以指定等待结果的超时时间 该时间以秒为单位。当超过预订时间时 expect 匹配到pexpect.TIMEOUT。如果难以估算程序运行的时间可以使用循环使其多次等待直至等待运行结束清单 11. 使用循环expect() 在执行中可能会抛出两种类型的异常分别是 EOF and TIMEOUF其中 EOF 通常代表子程序的退出 TIMEOUT 代表在等待目标正则表达式中出现了超时。清单 12. 使用并捕获异常此时可以将这两种异常放入expect等待的目标列表中清单 13. 避免异常expect 不断从读入缓冲区中匹配目标正则表达式当匹配结束时 pexpect 的 before 成员中保存了缓冲区中匹配成功处之前的内容 pexpect 的 after 成员保存的是缓冲区中与目标正则表达式相匹配的内容。清单 14. 打印 before 成员的内容此时 child.before 保存的就是在根目录下执行 ls 命令的结果。清单 15. send 系列函数这些方法用来向子程序发送命令模拟输入命令的行为。 与 send() 不同的是 sendline() 会额外输入一个回车符 更加适合用来模拟对子程序进行输入命令的操作。 当需要模拟发送 “Ctrlc” 的行为时还可以使用 sendcontrol() 发送控制字符。清单 16. 发送 ctrlc由于 send() 系列函数向子程序发送的命令会在终端显示所以也会在子程序的输入缓冲区中出现因此不建议使用 expect 匹配最近一次 sendline() 中包含的字符。否则可能会在造成不希望的匹配结果。清单 17. interact() 定义Pexpect还可以调用interact() 让出控制权用户可以继续当前的会话控制子程序。用户可以敲入特定的退出字符跳出其默认值为“^]” 。下面展示一个使用Pexpect和ftp交互的实例。清单 18. ftp 交互的实例该程序与 ftp 做交互登录到 ftp.openbsd.org 当提述输入登录名称和密码时输入默认用户名和密码当出现 “ftp” 这一提示符时切换到 pub/OpenBSD 目录并下载 README 这一文件。以下实例是上述方法的综合应用用来建立一个到远程服务器的 telnet 连接并返回保存该连接的 pexpect 对象。清单 19. 登录函数Pxssh 类的使用Pxssh 做为 pexpect 的派生类可以用来建立一个 ssh 连接它相比其基类增加了如下方法login() 建立到目标机器的ssh连接 losuckgout() 释放该连接 prompt() 等待提示符通常用于等待命令执行结束。下面的示例连接到一个远程服务器执行命令并打印命令执行结果。该程序首先接受用户输入用户名和密码login 函数返回一个 pxssh 对象的链接然后调用 sendline() 分别输入 “uptime”、“ls” 等命令并打印命令输出结果。清单 20. pxssh 示例Pexpect 使用中需要注意的问题spawn() 参数的限制在使用spawn执行命令时应该注意Pexpect 并不与 shell 的元字符例如重定向符号 、 、管道 | 还有通配符 * 等做交互所以当想运行一个带有管道的命令时必须另外启动一个 shell 为了使代码清晰以下示例使用了参数列表例如清单 21. 启动新的 shell 执行命令与线程共同工作Perl 也有 expect 的模块 Expect-1.21但是 perl 的该模块在某些操作系统例如 fedora 9 或者 AIX 5 中不支持在线程中启动程序执行以下实例试图利用多线同时程登录到两台机器进行操作不使用线程直接调用时 sub1() 函数可以正常工作但是使用线程时在 fedora9 和 AIX 5 中都不能正常运行。清单 22. perl 使用 expect 由于线程和 expect 共同使用导致不能正常工作的程序Pexpect 则没有这样的问题可以使用多线程并在线程中启动程序运行。但是在某些操作系统如 fedora9 中不可以在线程之间传递 Pexpect 对象。清单 使用 Pexpect 在线程中启动控制子程序应用实例在实际系统管理员的任务中有时需要同时管理多台机器这个示例程序被用来自动编译并安装新的内核版本并重启。它使用多线程每个线程都建立一个到远程机器的 telnet 连接并执行相关命令。 该示例会使用上文中的登录函数。清单 23. 管理多台机器示例相关主题访问 Expect 的主页了解更多 Expect 的内容。参考 Wiki 上关于 MIT 许可证的介绍。查看文章“ Expect 在网络管理中发挥着重要作用”介绍 Expect 在网络管理中的应用。Perl 语言中的 Expect 了解 Perl 语言中的 Expect 。在 developerWorks 上查阅所有 Linux 技巧和 Linux 教程。探索 Pexpect第 2 部分Pexpect 的实例分析概述通过本系列第一部分《探索 Pexpect第 1 部分剖析 Pexpect 》(请参阅参考资料)的介绍相信大家已经对 Pexpect 的用法已经有了比较全面的了解知道 Pexpect 是个纯 Python 语言实现的模块使用其可以轻松方便的实现与 ssh、ftp、passwd 和 telnet 等程序的自动交互但是读者的理解还可能只是停留在理论基础上本文将从实际例子入手具体介绍 Pexpect 的使用场景和使用心得体验实例中的代码读者都可以直接拿来使用相信会对大家产生比较大的帮助。 以下是本文所要介绍的所有 Pexpect 例子标题例 1ftp 的使用(注spawn、expect 和 sendline 的使用)例 2记录 log(注logfile、logfile_send和logfile_read的使用)例 3ssh 的使用例 4pxssh 的使用例 5telnet 的使用(注interact 的使用)pexpect 使用 tips调试 pexpect 程序的 tipspexpect 不会解释 shell 中的元字符EOF 异常和 TIMEOUT 异常使用 run() 来替代某些的 spawn 的使用expect_exact() 的使用expect() 中正则表达式的使用 tipsisalive() 的使用 tipsdelaybeforesend 的使用 tips例 1ftp 的使用本例实现了如下功能ftp 登录到 develperWorks.ibm.com 主机上并用二进制传输模式下载一个名叫 rmall的文件。清单 1. ftp 的例子代码注运行后输出结果为本例 expect 函数中的 pattern 使用了 List并包含了 pexpect.EOF和pexpect.TIMEOUT这样出现了超时或者 EOF不会抛出 expection 。(关于 expect() 函数的具体使用请参阅参考资料)如果程序运行中间出现了错误如用户名密码错误超时或者 EOF远程 server 连接不上都会使用 c hild.close(forceTrue) 关掉 ftp 子程序。调用 close 可以用来关闭与子程序的 connection 连接如果你不仅想关闭与子程序的连接还想确保子程序是真的被 terminate 终止了设置参数 forceTrue其最终会调用 c hild.kill(signal.SIGKILL) 来杀掉子程序。例 2记录 log本例实现了如下功能运行一个命令并将该命令的运行输出结果记录到 log 文件中 ./command.py [-a] [-c command] {logfilename} -c 后接的是要运行的命令的名字默认是“ls -l” logfilename 是记录命令运行结果的 log 文件名默认是“command.log”指定 -a 表示命令的输出结果会附加在 logfilename 后如果 logfilename 之前已经存在的话。清单 2. 记录 log 的例子代码注运行./command.py -a -c who cmd.loglogfile只能通过 spawn 类的构造函数指定。在 spawn 类的构造函数通过参数指定 logfile 时表示开启或关闭 logging 。所有的子程序的 input 和 output 都会被 copy 到指定的 logfile 中。设置 logfile 为 None 表示停止 logging默认就是停止 logging 。设置 logfile 为 sys.stdout会将所有东西 echo 到标准输出。logfile_read和logfile_send:logfile_read只用来记录 python 主程序接收到 child 子程序的输出有的时候你不想看到写给 child 的所有东西只希望看到 child 发回来的东西。 logfile_send只用来记录 python 主程序发送给 child 子程序的输入 logfile、logfile_read 和 logfile_send 何时被写入呢 logfile、logfile_read 和 logfile_send 会在每次写 write 和 send 操作后被 flush 。调用 send 后才会往 logfile 和 logfile_send 中写入sendline/sendcontrol/sendoff/write/writeline 最终都会调用 send所以 sendline 后 logfile 中一定有内容了只要此时 logfile 没有被 close 。调用 read_nonblocking 后才会往 logfile 和 logfile_read 中写入expect_loop 会调用 read_nonblocking而 expect_exact 和 expect_list 都会调用 expect_loopexpect 会调用 expect_list所以 expect 后 logfile 中一定有内容了只要此时 logfile 没有被 close 。如果调用的函数最终都没有调用 send 或 read_nonblocking那么 logfile 虽然被分配指定了一个 file但其最终结果是内容为空。见下例清单 3. log 内容为空的例子代码运行该脚本后你会发现其实 log.txt 是空的没有记录 ls -l 命令的内容原因是没有调用 send 或 read_nonblocking真正的内容没有被 flush 到 log 中。如果在 fout.close() 之前加上 p.expect(pexpect.EOF)log.txt 才会有 ls -l 命令的内容。例 3ssh 的使用本例实现了如下功能ssh 登录到某个用户指定的主机上运行某个用户指定的命令并输出该命令的结果。清单 4. ssh 的例子代码注运行后输出结果为使用了 getpass.getpass() 来获得用户输入的密码与 raw_input 不同的是getpass.getpass() 不会将用户输入的密码字符串 echo 回显到 stdout 上。(更多 python 相关技术请参阅参考资料)例 4pxssh 的使用本例实现了如下功能使用 pexpect 自带的 pxssh 模块实现 ssh 登录到某个用户指定的主机上运行命令’ uptime ’和’ ls -l ’并输出该命令的结果。清单 5. 使用 pxssh 的例子代码运行后输出结果为pxssh 是 pexpect 中 spawn 类的子类增加了 login, logout 和 prompt 几个方法使用其可以轻松实现 ssh 连接而不用自己调用相对复杂的 pexpect 的方法来实现。 pxssh 做了很多 tricky 的东西来处理 ssh login 过程中所可能遇到的各种情况。比如如果这个 session 是第一次 loginpxssh 会自动接受远程整数 remote certificate 如果你已经设置了公钥认证pxssh 将不会再等待 password 的提示符。(更多 ssh 相关知识请参阅参考资料) pxssh 使用 shell 的提示符来同步远程主机的输出为了使程序更加稳定pxssh 还可以设置 prompt 为更加唯一的字符串而不仅仅是“ $ ”和“ # ”。login 方法使用原始 original_prompt 来找到 login 后的提示符(这里默认 original_prompt 是“$”或“#”但是有时候可能也是别的 prompt这时就需要在 login 时手动指定这个特殊的 prompt见上例有可能是“ ”)如果找到了立马使用更容易匹配的字符串来重置该原始提示符(这是由 pxssh 自己自动做的通过命令 PS1[PEXPECT]\$ 重置原始提示符然后每次 expect 匹配 \[PEXPECT\][\$\#])。原始提示符是很容易被混淆和胡弄的为了阻止错误匹配最好根据特定的系统指定更加精确的原始提示符例如 Message Of The Day 。 有些情况是不允许重置原始提示符的这时就要设置 auto_prompt_reset 为 False 。而且此时需要手动设置 PROMPT 域为某个正则表达式来 match 接下来要出现的新提示符因为 prompt() 函数默认是 expect 被重置过的 PROMPT 的。prompt方法匹配新提示符(不是 original_prompt)。注这只是匹配提示符不能匹配别的 string如果要匹配特殊 string需直接使用父类 spawn 的 expect 方法。 prompt 方法相当于是 expect 方法的一个快捷方法。如果auto_prompt_reset 为 False这时需要手动设置 PROMPT 域为某个正则表达式来 match 接下来要出现的 prompt因为 prompt() 函数默认是 expect 被重置过的 PROMPT 的。logout方法发送exit给远程 ssh 主机如果有 stopped jobs会发送exit两次。例 5telnet 的使用本例实现了如下功能telnet 登录到某远程主机上输入命令“ls -l”后将子程序的执行权交还给用户用户可以与生成的 telnet 子程序进行交互。清单 6. telnet 的例子代码运行后输出结果为interact方法通常一个 python 主程序通过 pexpect.spawn 启动一个子程序一旦该子程序启动后python 主程序就可以通过 child.expect 和 child.send/child.sendline 来和子程序通话python 主程序运行结束后子程序也就死了。比如 python 主程序通过 pexpect.spawn 启动了一个 telnet 子程序在进行完一系列的 telnet 上的命令操作后python 主程序运行结束了那么该 telnet session(telnet 子程序)也会自动退出。但是如果调用 child.interact那么该子程序(python 主程序通过 pexpect.spawn 衍生成的)就可以在运行到 child.interact 时将子程序的控制权交给了终端用户(the human at the keyboard)用户可以通过键盘的输入来和子程序进行命令交互管理子程序的生杀大权用户的键盘输入 stdin 会被传给子程序而且子程序的 stdout 和 stderr 输出也会被打印出来到终端。 默认 ctrl ] 退出 interact() 模式把子程序的执行权重新交给 python 主程序。参数 escape_character 指定了交互模式的退出字符例如 child.interact(chr(26)) 接下来就会变成 ctrl z 退出 interact() 模式。pexpect 使用 tips调试 pexpect 程序的 tips获得 pexpect.spawn 对象的字符串 value值将会给 debug 提供很多有用信息。清单 7. 打印 pexpect.spawn 对象的字符串 value 值的例子代码将子程序的 input 和 output 打 log 到文件中或者直接打 log 到屏幕上也非常有用清单 8. 记录 log 的例子代码pexpect 不会解释 shell 中的元字符pexpect 不会解释 shell 的元字符如重定向 redirect管道 pipe和通配符 wildcards( “ ” , “ | ”和“ * ”等 ) 如果想用的话必须得重新启动一个新 shell(在 spawn 的参数 command 中是不会解释他们的视其为 command string 的一个普通字符)清单 9. 重新启动一个 shell 来规避 pexpect 对元字符的不解释如果想在 spawn 出来的新子程序中使用重定向 redirect管道 pipe和通配符 wildcards( “ ” , “ | ”和“ * ”等 )好像没有好的方法只能不使用这些字符先利用 expect 匹配命令提示符从而在 before 中可以拿到之前命令的结果然后在分析 before 的内容达到使用重定向 redirect, 管道 pipe, 和通配符 wildcards 的目的。EOF 异常和 TIMEOUT 异常TIMEOUT 异常如果子程序没有在指定的时间内生成任何 output那么 expect() 和 read() 都会产生 TIMEOUT 异常。超时默认是 30s可以在 expect() 和 spawn 构造函数初始化时指定为其它时间如如果你想让 expect() 和 read() 忽略超时限制即无限期阻塞住直到有 output 产生设置 timeout 参数为 None。清单 10. 忽略 timeout 超时限制的例子代码EOF 异常可能会有两种 EOF 异常被抛出但是他们除了显示的信息不同其实本质上是相同的。为了实用的目的不需要区分它们他们只是给了些关于你的 python 程序到底运行在哪个平台上的额外信息这两个显示信息是有些 UNIX 平台当你读取一个处于 EOF 状态的文件描述符时会抛出异常其他 UNIX 平台却只会静静地返回一个空字符串来表明该文件已经达到了状态。使用 run() 来替代某些的 spawn 的使用pexpect 模块除了提供 spawn 类以外还提供了 run() 函数使用其可以取代一些 spawn 的使用而且更加简单明了。清单 11. 使用 run() 来替代 spawn 的使用的例子代码run (command, timeout-1, withexitstatusFalse, eventsNone, extra_argsNone, logfileNone, cwdNone, envNone):command执行一个命令然后返回结果run() 可以替换 os.system()(更多 os.system() 知识请参阅参考资料)因为 os.system() 得不到命令输出的结果返回的 output 是个字符串STDERR 也会包括在 output 中如果全路径没有被指定那么 path 会被 searchtimeout单位 s 秒每隔 timeout 生成一个 pexpect.TIMEOUT 异常每行之间被 CR/LF (\\r\\n) 相隔即使在 Unix 平台上也是 CR/LF因为 Pexpect 子程序是伪 tty 设备withexitstatus设置为 True则返回一个 tuple里面包括 (command_output, exitstatus)如果其为 False那么只是仅仅返回 command_outputevents是个 dictionary里面存放 {pattern:response} 。无论什么时候 pattern 在命令的结果中出现了会出现以下动作发送相应的 response String 。如果需要回车符“ Enter ”的话“ \\n ”也必须得出现在 response 字符串中。response 同样也可以是个回调函数不过该回调函数有特殊要求即它的参数必须是个 dictionary该 dictionary 的内容是包含所有在 run() 中定义的局部变量从而提供了方法可以访问 run() 函数中 spawn 生成的子程序和 run() 中定义的其他局部变量其中 event_count, child, 和 extra_args 最有用。回调函数可能返回 True从而阻止当前 run() 继续执行否则 run() 会继续执行直到下一个 event 。回调函数也可能返回一个字符串然后被发送给子程序。 extra_args 不是直接被 run() 使用它只是提供了一个方法可以通过 run() 来将数据传入到回调函数中(其实是通过 run() 定义的局部变量 dictionary 来传)清单 12. 其它一些使用 run() 的例子代码expect_exact() 的使用expect_exact(self, pattern_list, timeout -1, searchwindowsize -1); expect_exact() 与 expect() 类似但是 pattern_list 只能是字符串或者是一个字符串的 list不能是正则表达式其匹配速度会快于 expect()原因有两个一是字符串的 search 比正则表达式的匹配要快另一个则是可以限制只从输入缓冲的结尾来寻找匹配的字符串。还有当你觉得每次要 escape 正则表达式中的特殊字符为普通字符时很烦那么你也可以使用 expect_exact() 来取代 expect()。清单 13. expect_exact() 的例子代码expect() 中正则表达式的使用 tipsexpect() 中的正则表达式不是贪婪匹配 greedy match而是最小匹配即只匹配缓冲区中最早出现的第一个字符串。 因为是依次读取一个字符的 stream 流来判断是否和正则表达式所表达的模式匹配所以如果参数 pattern 是个 list而且不止一次匹配那么缓冲区中最早出现的第一个匹配的字符串才算数。清单 14. expect() 的最小匹配例子代码“$”不起任何作用匹配一行的结束 (end of line)必须得匹配 CR/LF正则表达式中$可以匹配一行的结束(具体$正则表达式的使用请参阅参考资料)但是 pexpect 从子程序中一次只读取一个字符而且每个字符都好像是一行的结束一样pexpect 不能在子程序的输出流去预测。匹配一行结束的方法必须是匹配 \r\n (CR/LF) 。即使是 Unix 系统也是匹配 \r\n (CR/LF)因为 pexpect 使用一个 Pseudo-TTY 设备与子程序通话所以当子程序输出 \n 你仍然会在 python 主程序中看到 \r\n 。原因是 TTY 设备更像 windows 操作系统每一行结束都有个 \r\n (CR/LF) 的组合当你从 TTY 设备去解释一个 Unix 的命令时你会发现真正的输出是 \r\n (CR/LF)一个 Unix 命令只会写入一个 linefeed (\n)但是 TTY 设备驱动会将其转换成 \r\n (CR/LF) 。清单 15. 匹配一行结束 1如果你只是想跳过一个新行直接 expect(\n) 就可以了但是如果你想在一行的结束匹配一个具体的 pattern 时就必须精确的寻找 (\r)见下例清单 16. 匹配一行结束 2这个问题其实不只是 pexpect 会有如果你在一个 stream 流上实施正则表达式匹配时都会遇到此问题。正则表达式需要预测stream 流中很难预测因为生成这个流的进程可能还没有结束所以你很难知道是否该进程是暂时性的暂停还是已经彻底结束。当 . 和 * 出现在最后时child.expect (.); 因为是最小匹配所以只会返回一个字符而不是一个整个一行(虽然 pexpect 设置了 re.DOTALL会匹配一个新行。 child.expect (.*); 每次匹配都会成功但是总是没有字符返回因为 * 表明前面的字符可以出现 0 次 , 在 pexpect 中一般来说任何 * 都会尽量少的匹配。isalive() 的使用 tipsisalive(self)测试子程序是否还在运行。这个方法是非阻塞的如果子程序被终止了那么该方法会去读取子程序的 exitstatus 或 signalstatus 这两个域。返回 True 表明子程序好像是在运行返回 False 表示不再运行。当平台是 Solaris 时可能需要几秒钟才能得到正确的状态。 当子程序退出后立马执行 isalive() 有时可能会返回 1 (True)这是一个 race condition原因是子程序已经关闭了其文件描述符但是在 isalive() 执行前还没有完全的退出。增加一个小小的延时会对 isalive() 的结果有效性有帮助。清单 17. isalive() 的例子代码delaybeforesend 的使用 tipsspawn 类的域 delaybeforesend 可以帮助克服一些古怪的行为。比如经典的是当一个用户使用 expect() 期待 Password: 提示符时如果匹配立马 sendline() 发送密码给子程序但是这个用户会看到他们的密码被 echo back 回显回来了。这是因为通常许多应用程序都会在打印出 Password: 提示符后立马关掉 stdin 的 echo但是如果你发送密码过快在程序关掉 stdin 的 echo 之前就发送密码出去了那么该密码就会被 echo 出来。清单 18. delaybeforesend 的例子代码相关主题访问 Expect 的主页了解更多 Expect 的内容。访问 Python 官方网页了解更多 Python 相关知识。有关正则表达式方面相关知识请访问正则表达式。更多 SSH 相关知识请访问 SSH。更多 os.system() 的介绍请访问 os.system()。在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。参考帖子