2

pexpect モジュールに関するサポートが必要

sshを使用してサーバーからgitリポジトリを複製する簡単なコードを作成しました。私はいくつかの問題に直面しています。

パスワードは平文で表示されます。

ダウンロード後にプログラムを終了する適切な方法がわかりません。次のエラーがスローされます...

Traceback (most recent call last):
File "ToDelete3.py", line 65, in <module>
  # # if i == 1:
File "ToDelete3.py", line 36, in getRepository
  i = p.expect([ssh_key,'password:',pexpect.EOF])
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1492, in interact
  self.__interact_copy(escape_character, input_filter, output_filter)
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1520, in __interact_copy
  data = self.__interact_read(self.child_fd)
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1510, in __interact_read
  return os.read(fd, 1000)
OSError: [Errno 5] Input/output error

これまでに書いたコードは次のとおりです。

command = 'git clone ssh://username@someserver/something.git'
ssh_key = 'Are you sure you want to continue connecting'

def gracefulExit():
    print 'Password Incorrect !!!'
    os._exit(1)

def getRepository():
    p = pexpect.spawn(command,maxread=10000,timeout = 100)
    p.logfile = sys.stdout  # logs out the command  
    i = p.expect([ssh_key,'password:',pexpect.EOF])
    if i == 0:
         print 'Inside sshkey'
         p.sendline('yes')
         i = p.expect([ssh_key,'password:',pexpect.EOF])
    if i == 1:
        try:
            p.sendline('mypassword') # this mypassword is shown in clear text on the console
            p.interact()
            p.logfile = sys.stdout
            p.expect(pexpect.EOF)
        except Exception,e:
            print str(e)
            gracefulExit()
    if i == 2:
        print 'Inside EOF block'
        if p.isalive():
            print '******************************************************'
            print '         Closing the process of Download !!!          '
            print '******************************************************\n\n'
            p.close()

どんな入力でも大歓迎です..

ありがとう。-ビジェイ

4

2 に答える 2

3

プログラムにはいくつかのエラーがあります。

p.interact()

これは、pexpect モジュールを使用してパスワードを自動的に提供した後に制御を取り戻したい場合に使用されます。リポジトリ全体のチェックアウトを自動化しているため、これを使用する必要はありません。

また、パスワードを渡した後、Git リポジトリをコピーするのに時間がかかる場合があるため、無限のタイムアウトを設定することで、いくつか改善することができます。

p.expect(pexpect.EOF, timeout=None)

その後、次のコマンドですべての実行出力を読み取ることができます

output_lines =  p.before
output_lines_list = output_lines.split('\r\n')
for line in output_lines: print line

上記を使用して、ファイルに直接書き込むことにより、出力をファイルに記録することもできます

パスワードp.logifile = sys.stdoutの受け渡しも含めて最初から pexpect の操作を記録してしまうので使い勝手は良くありません。

この後、閉じる必要はありません。対話型プログラムを実行していません。次の行をすべて削除します。

if i == 2:
        print 'Inside EOF block'
        if p.isalive():
            print '******************************************************'
            print '         Closing the process of Download !!!          '
            print '******************************************************\n\n'
            p.close()

問題は、パスワードを保存して p.sendline で使用する必要がある場所です。ただし、パスワードを保存すると、安全ではなくなります。パスワードの開始時に入力を取得することもできます。この方法では、プログラム内にパスワードを保存することはありませんが、自動化は無効になります。抜け道はわかりませんが、パスワード入力を取得するには、次のことができます。

import getpass
getpass.getpass("please provide your password")
于 2012-06-26T15:14:31.190 に答える
0

パスワードが標準出力にエコーされないようにするには、出力をリダイレクトするときに次を使用します -

p.logfile_read = sys.stdout  # logs out the command  

私はこれを自分で試してみましたが、うまくいっているようです。 これがこの啓示の参照です。

于 2012-12-01T07:07:41.080 に答える