ssh с использованием python без ключей RSA

Новое для Stackoverflow, так что сначала, привет.

Я работаю над небольшим проектом для своей школы, который, как предполагается, является обычным gui (написанным на python как образовательный вызов для меня, поскольку я никогда не использовал python) для программы Unison с открытым исходным кодом. Мы пытаемся разрешить студентам и сотрудникам синхронизировать папку дома и в школу, запустив эту программу с минимальными затратами (идиот-защита, если хотите). Предполагается, что интерфейс – это только имя пользователя и пароль для школы, и оболочка gui должна просто отправить имя пользователя и пароль в Unison и синхронизировать их.

Проблема в том, что Unison в свою очередь запускает SSh и запрашивает пароль, но метод python subprocess.communicate (input) не позволит ssh взять пароль. Я понял, что ssh будет принимать входные данные только от терминала, и я не могу понять, как его обмануть. Я читал некоторые вещи об использовании псевдотерминала, но я все еще в тупике. RSA-ключи были бы идеальным решением, но генерировать их, а затем размещать их на удаленном сервере все равно заставляют меня заходить с паролем хотя бы один раз, и для этого потребуется решение выше, или терминал, который не является идиотским доказательством.

def startSync(self): ''' ''' userName = self.userNameIn.get() userPass = self.userPassIn.get() localDir = "/Users/localuser/syncFolder/" remoteDir = " ssh://schoolServer/remotesyncFolder" #for testing purposes, I set this to my own home machine which logs into my own account if I don't provide me@myserver.net unisonExecRemotePath = " -servercmd /Users/RemoteMe/unison" #unison is the unix executable responsible for launching unison on the remote system silenceCmdPrompts = " -silent" #keeps unison from displaying directory differences and asking if its okay to sync executionString = "./unison" + localDir + remoteDir + unisonExecRemotePath + silenceCmdPrompts mainProcess = subprocess.Popen(executionString,shell = True, stdin = subprocess.PIPE) mainProcess.communicate(userPass) 

Строки исполнения отлично работают в терминале, если я вставляю его. И любые общие советы python также будут оценены, если вы так склонны.

Благодаря!

Unison Руководство пользователя: http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html

Edit: Я должен также отметить, что, хотя я в настоящее время разрабатываю под OSX и Linux, мне в конечном итоге придется сделать эти окна совместимыми, так как большинство учеников моей школы запускают окна в качестве основной (или единственной) машины.

2 Solutions collect form web for “ssh с использованием python без ключей RSA”

Посмотрите на pexpect .

 import pexpect child = pexpect.spawn('ssh myname@host.example.com') child.expect('Password:') child.sendline(mypassword) child.interact() 

Если вы хотите отправить пароль в ssh вам нужно открыть псевдотерминал ( pty ) и поговорить с ним, используя это вместо того, чтобы просто использовать stdin / stdout . Взгляните на модуль pexpect , который предназначен именно для этого.

Альтернативное решение будет включать какой-то внеполосный механизм распространения открытых ключей: например, создать простое веб-приложение, в котором люди могут вставлять открытый ключ и управлять файлом authorized_keys от имени пользователя.

Python - лучший язык программирования в мире.