0

I want to authenticate a user from a local linux host using subprocess. I have used this code and i doubt login is the perfect command to do because login command prompts for password and I want to provide the password upfront. login man

If not login then is there any other linux command through which I can authenticate a local user ?

#!/usr/bin/python3
import subprocess
import cgi

print()

cred = cgi.FieldStorage()

username = cred.getvalue("user")
password = cred.getvalue("password")

# print(username)
# print(password)

cmd = f"echo {password} | sudo /usr/bin/login {username}"
# cmd = "ls -la"

print(cmd)

output = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, text=True)

print(output)


This is the output I am getting as of now.

CompletedProcess(args='echo ashu234 | sudo /usr/bin/login ashu', returncode=1, stdout='')
1
  • Try Python PAM ... Commented Dec 15, 2021 at 1:29

1 Answer 1

2

You can use pexpect. Unless you are running your script as root you will need to supply a password to sudo (as you will have to for any answer that uses sudo). To make the script more portable also supply a sudo user name but you could hard code this if using root. This code was written for Ubuntu 21.10 and may need the strings updating for other distributions. I think the code is self-explanatory, you spawn a process, interact with it and expect certain responses during exection.

import pexpect

sudo_user = 'whatever your sudo user name is'
sudo_password = "whatever your sudo user password is"
user_name = "whatever local user name is"
password = "whatever local user password is"

child = pexpect.spawn(f'/usr/bin/sudo /usr/bin/login {user_name}', encoding='utf-8')
child.expect_exact(f'[sudo] password for {sudo_user}: ')
child.sendline(sudo_password)
return_code = child.expect(['Sorry, try again', 'Password: '])
if return_code == 0:
    print('Can\'t sudo')
    print(child.after)  # debug
    child.kill(0)
else:
    child.sendline(password)
    return_code = child.expect(['Login incorrect', '[#\\$] '])
    if return_code == 0:
        print('Can\'t login')
        print(child.after)  # debug
        child.kill(0)
    elif return_code == 1:
        print('Login OK.')
        print('Shell command prompt', child.after)

For more detail see the docs https://pexpect.readthedocs.io/en/stable/overview.html

Sign up to request clarification or add additional context in comments.

1 Comment

@DanDev thanks for the information

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.