如何使用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()
方法 2:使用 spawn 类
Spawn 类是启动新子进程并对其进行控制的主要接口。 spawn里面的字符串可以替换为需要执行的shell命令。
Syntax: pexpect.spawn(“rm ./dev”)
pexpect.spawn 类的重要方法是except()。
Syntax: except(pattern, timeout=-1, searchwindowsize=-1, async_= False)
此方法等待子进程返回给定的字符串。在 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"]))
输出:
该示例打印与子进程匹配的索引。
方法 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"]))
输出:
让我们看一个复杂的例子,以便更好地理解。这里将使用 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()
输出: