3

pexpect モジュールを使用してファイルを SFTP しようとしています。

sftp_opts = ['-o', 'Port=%s' % port,
                 '-o', 'UserKnownHostsFile=%s' % known_hosts_file,
                 '-o', 'PasswordAuthentication=yes',
                 '%s@%s' % (user, host)]
    p = pexpect.spawn('sftp', sftp_opts)

    try:
      p.expect('(?i)password:')
      x = p.sendline(password)
      x = p.expect('sftp>')
      x = p.sendline('cd ' + remote_dir)
      x = p.expect('sftp>')
      x = p.sendline('put ' + filename)
      x = p.expect('sftp>')
      x = p.isalive()
      x = p.close()
      retval = p.exitstatus
    except pexpect.EOF:
      print('SFTP file transfer failed due to premature end of file.')
      return False
    except pexpect.TIMEOUT:
      print('SFTP file transfer failed due to timeout.')
      return False

SSH 経由で接続して認証できるように見えますが、retval は常に 1 (終了ステータス) であり、ファイルは sftp されません。

ここで何か不足していますか?

p (p.close() ではなく p.wait()) を待機しようとすると、戻りません。

4

1 に答える 1

2

答えとして要約するには:

  • デバッグ ログをオンにして、何が問題なのかをよりよく把握します。デビッド・K・ヘスより

  • pexpect を使用しますが、sftp の代わりに scp を自動化します。ssh キーを使用することをお勧めします。ヨルナムから

  • paramiko ssh lib の sftp 関数を使用します。儚いから

于 2012-09-20T13:00:20.090 に答える