📜  如何使用Python Pexpect 自动化 Linux 命令?

📅  最后修改于: 2022-05-13 01:54:43.009000             🧑  作者: Mango

如何使用Python Pexpect 自动化 Linux 命令?

Pexpect是一个Python库,用于生成子进程并自动控制它们。 Pexpect 可用于自动执行交互应用程序,例如 ssh、FTP、密码、telnet 等。 Pexpect 的工作方式类似于 span child 并响应预期模式。

安装:

可以使用以下命令安装 Pexpect。

pip3 install pexpect

自动化 Linux 命令:

它可以通过不同的方式完成:

  • 使用 run() 方法
  • 使用生成类
  • 使用 sendline() 方法

安装后让我们看看如何自动化 Linux 命令。

方法一:使用run()方法



可以调用pexpect.run()方法来执行命令并返回其输出。这个函数可以作为 os.system 的替代品。

例子:

Python3
import pexpect
 
print(pexpect.run('echo hello'))


Python3
import pexpect
 
# start a child  process with spawn
# It just echos  geeksforgeeks
child = pexpect.spawn("echo geeksforgeeks")
 
# prints he matched index of string.
print(child.expect(["hai", "welcome", "geeksforgeeks"]))


Python3
import pexpect
 
# Start a child process with spawn
# This process  waits for the input
# form user
child = pexpect.spawn("cat")
 
# The input to the cat process is sent
# by the sendline()
child.sendline("hai geek")
 
# prints the index of matched string
# expressing with child process
print(child.expect(["hello", "hai geek"]))


Python3
import pexpect
 
 
def main():
 
    # spawn a child process.
    child = pexpect.spawn('ftp ftp.us.debian.org')
 
    # search for the Name patter.
    child.expect('Name .*: ')
 
    # send the username with sendline
    child.sendline('anonymous')
 
    # search for the  Password pattern
    child.expect('Password:')
 
    # send the password to the childprocess
    # by sendline
    child.sendline('anonymous@')
 
    # detect ftp accepts command from user
    # by 'ftp> ' pattern
    child.expect('ftp> ')
 
    # If  it accepts command then download the
    # welcome.msg file from the ftp server
    child.sendline('get welcome.msg')
 
    # again check wheather ftp client accepts
    # command from user by 'ftp> ' pattern
    child.expect('ftp> ')
 
    # close the ftp client.
    child.sendline('bye')
 
    # print the interactions with the child
    # process.
    print(child.before.decode())
    child.interact()
 
    # print the downloaded file by executing cat
    # command with pexpect.run method
    print(pexpect.run('cat ./welcome.msg').decode())
 
 
if __name__ == '__main__':
    main()


图。1

方法 2:使用 spawn 类

Spawn 类是启动新子进程并对其进行控制的主要接口。 spawn里面的字符串可以替换为需要执行的shell命令。

pexpect.spawn 类的重要方法是except()。

此方法等待子进程返回给定的字符串。在 except 方法中指定的模式将通过字符串全部匹配。超时用于上升 pexpect.TIMEOUT。 searchwindowsize 用于设置类的 maxread。创建非阻塞应用程序时设置 async_ = True。

例子:

蟒蛇3

import pexpect
 
# start a child  process with spawn
# It just echos  geeksforgeeks
child = pexpect.spawn("echo geeksforgeeks")
 
# prints he matched index of string.
print(child.expect(["hai", "welcome", "geeksforgeeks"]))

输出:

图2

该示例打印与子进程匹配的索引。

方法 3:使用 sendline( s = ” “ )

此方法将字符串写入子进程并返回写入的字节数。当有人从终端打字时,它出现在子进程中。

例子:

蟒蛇3

import pexpect
 
# Start a child process with spawn
# This process  waits for the input
# form user
child = pexpect.spawn("cat")
 
# The input to the cat process is sent
# by the sendline()
child.sendline("hai geek")
 
# prints the index of matched string
# expressing with child process
print(child.expect(["hello", "hai geek"]))

输出:

图3

让我们看一个复杂的例子,以便更好地理解。这里将使用 FTP 客户端登录 ftp.us.debian.org 并下载welcome.msg 文件并打印该文件。在这里,我们将使用 FTP 客户端从远程机器登录并下载文件,然后进行打印。

方法:

  • 进口预期。
  • 用 pexpect.spawn('ftp ftp.us.debian.or') 生成一个孩子。
  • FTP 客户端要求输入用户名。将模式与 expect('Name .*: ') 匹配
  • 使用 sendline 方法将用户名发送到子进程。
  • 然后 FTP 客户端要求输入密码。将模式与 expect('Password: ') 匹配
  • 然后服务登录。然后就可以下载文件了。
  • 通过'ftp>'的存在检测是否可以向FTP服务器发送命令。
  • 然后通过 sendline('getwelcome.msg') 发送命令,这只是将文件下载到本地机器。
  • 然后使用“bye”命令关闭 FTP 客户端。
  • 最后,使用 child.before 打印与子进程的所有交互。它返回一个字节字符串,在打印之前对其进行解码。
  • 使用 pexpect.run 打印从 FTP 服务器下载的文件的内容。

蟒蛇3

import pexpect
 
 
def main():
 
    # spawn a child process.
    child = pexpect.spawn('ftp ftp.us.debian.org')
 
    # search for the Name patter.
    child.expect('Name .*: ')
 
    # send the username with sendline
    child.sendline('anonymous')
 
    # search for the  Password pattern
    child.expect('Password:')
 
    # send the password to the childprocess
    # by sendline
    child.sendline('anonymous@')
 
    # detect ftp accepts command from user
    # by 'ftp> ' pattern
    child.expect('ftp> ')
 
    # If  it accepts command then download the
    # welcome.msg file from the ftp server
    child.sendline('get welcome.msg')
 
    # again check wheather ftp client accepts
    # command from user by 'ftp> ' pattern
    child.expect('ftp> ')
 
    # close the ftp client.
    child.sendline('bye')
 
    # print the interactions with the child
    # process.
    print(child.before.decode())
    child.interact()
 
    # print the downloaded file by executing cat
    # command with pexpect.run method
    print(pexpect.run('cat ./welcome.msg').decode())
 
 
if __name__ == '__main__':
    main()

输出:

图 4