Skip to content
Related Articles

Related Articles

Improve Article

How to use Python Pexpect to Automate Linux Commands?

  • Last Updated : 13 Jul, 2021

Pexpect is a Python library to spawning child processes and controlling them automatically. Pexpect can be used to automate interacting applications such as ssh, FTP, password, telnet, etc. Pexpect works like span child and responds to expected patterns.

Installation:

The Pexpect can be installed by using the following command.

pip3 install pexpect

Automating Linux commands:

It can be done in different ways:

  • Using run() method
  • Using spawn class
  • Using sendline() method

After the installation let’s see how to automate the Linux commands.

Method 1: Using run() method



The pexpect.run() method can be called to execute a command and return its output. This function can be used as a replacement for os.system.

Example:

Python3




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

fig 1

Method 2: Using spawn class

Spawn class is the main interface to start a new child process and control it. The string inside spawn can be replaced by the shell command that needs to be executed.

Syntax: pexpect.spawn(“rm ./dev”)

The important methods of pexpect.spawn class are except().

Syntax: except(pattern, timeout=-1, searchwindowsize=-1, async_= False)



This method waits for the child process to return a given string.  The pattern specified in the except method will be matched all through the string. The timeout is used to rise pexpect.TIMEOUT.  The searchwindowsize is used to set the maxread of the class. Set async_ = True when creating a non-blocking application.

Example:

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"]))

Output:

fig 2

The example prints the index that matches with the child process.

Method 3: Using sendline(s = ” “)

This method writes the string to the child process and also returns the number of bytes written. It appears to the child process as someone is typing from the terminal. 

Example:

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"]))

Output:

fig 3

Let’s see a complex example for better understanding. Here where will use the FTP client to login into ftp.us.debian.org and download welcome.msg file and print the file.  Here we are going to use an FTP client to login and download files from a remote machine and then print.

Approach:

  • Import pexpect.
  • spawn a child with pexpect.spawn(‘ftp ftp.us.debian.or’).
  • FTP client asks for the user name. Match the pattern with expect(‘Name .*:  ‘)
  • Send the username to child process with sendline method.
  • Then the FTP client asks for the password. Match the pattern with expect(‘Password:  ‘)
  • Then the serve logged in. Then you can download files.
  • Detect whether you can send command to the FTP server by the presence of  ‘ftp> ‘.
  • Then send the command by sendline(‘get welcome.msg’), this just downloads the file to the local machine.
  • Then close the FTP client by using the ‘bye’ command.
  • Finally, print all the interactions with the child process with the child.before. It returns a byte string, decodes it before printing it.
  • Use pexpect.run to print the content of the downloaded file from the FTP server.

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()

Output:

Fig  4

 Attention geek! Strengthen your foundations with the Python Programming Foundation Course and learn the basics.  

To begin with, your interview preparations Enhance your Data Structures concepts with the Python DS Course. And to begin with your Machine Learning Journey, join the Machine Learning – Basic Level Course




My Personal Notes arrow_drop_up
Recommended Articles
Page :