Cobry
Cobry

Reputation: 4548

python ssh password prompt

I am trying to get automatic password passing upon prompt while using ssh. normally, rsa keys are used to prevent password prompt but I can't guarantee every user is set up properly so i want the script to automatically set the password if given by the user

Here is the

ssh = subprocess.Popen(["ssh", "localhost", "python -c 'print \"I am running\"' "], shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> Password:

My tried solution was

import sys, subprocess

class GetPass():
    def __init__(self, password):
       self.password=str(password)
    def readline(self):
        return self.password

sys.stdin = GetPass('mypassword')
# test raw_input 3 time to verify
raw_input()    
>> 'mypassword'
raw_input()    
>> 'mypassword'
raw_input()    
>> 'mypassword'

# Now try sshing again
ssh = subprocess.Popen(["ssh", "localhost", "python -c 'print \"I am running\"' "], shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
>>> Password:

This is not working as requesting password is still prompted. The idea is that GetPass replacing sys.stdin will always return the desired password automatically without the user typing it himself.

any idea or solution ?

Upvotes: 2

Views: 3094

Answers (1)

dgc
dgc

Reputation: 565

SSH reads the password from the terminal, not from stdin, so there's no way you can provide a synthetic (not prompted) password using subprocess.Popen.

I understand not wanting to lade your application with dependencies, but I also would recommend paramiko for this. Without that, you're looking at using a workflow manager like pyexpect for fabric anyway, unless you implement the whole workflow yourself using a pseudoterminal. You can do that without introducing dependencies, but frankly it's not worth the extra surface area for bugs or behavior divergence.

Still, if you want to try it, here's a gist that outlines an approach. You could simplify this quite a lot but it gets the essentials across.

Upvotes: 2

Related Questions