5

Stackoverflow は初めてなので、まずはこんにちは。

私は、オープン ソースの Unison プログラム用のカスタム GUI (私は Python を使用したことがないので、教育上の課題として Python で作成されたもの) であるはずの私の学校の小さなプロジェクトに取り組んでいます。できるだけ少ない入力でこのプログラムを起動することにより、学生とスタッフが自宅と学校のフォルダーを同期できるようにしています (必要に応じて馬鹿を証明します)。インターフェースは学校のユーザー名とパスワードだけであると想定されており、GUI ラッパーはユーザー名とパスワードを Unison に送信して同期するだけです。

問題は、Unison が順番に SSh を起動してパスワードを要求することですが、python subprocess.communicate(input) メソッドでは ssh にパスワードを取得させません。ssh は端末からの入力のみを受け入れることに気付きましたが、それをだます方法がわかりません。疑似端末の使用についていくつか読んだことがありますが、まだ困惑しています。RSAキーは理想的なソリューションですが、それらを生成してリモートサーバーに配置するには、少なくとも1回はパスワードでログインする必要があり、それには上記のソリューション、またはばかではない端末が必要です。

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

編集: また、現在 OSX と Linux で開発を行っていますが、学校のほとんどの生徒がプライマリ (または唯一の) マシンとして Windows を実行しているため、最終的にはこの Windows を互換性のあるものにする必要があることに注意してください。

4

2 に答える 2

3

pexpectを調べます。

import pexpect

child = pexpect.spawn('ssh myname@host.example.com')
child.expect('Password:')
child.sendline(mypassword)
child.interact()
于 2012-05-11T16:42:28.930 に答える