29

python subprocess モジュールを使用して安全な ftp サイトにログインし、ファイルを取得しようとしています。ただし、要求されたときにパスワードを送信しようとするだけでハングアップし続けます。これまでのところ、次のコードがあります。

from subprocess import Popen, PIPE

proc = Popen(['sftp','user@server', 'stop'], stdin=PIPE)
proc.communicate('password')

これは、パスワード プロンプトで停止します。パスワードを手動で入力すると、ftp サイトに移動し、コマンド ラインでパスワードを入力します。人々が pexpect の使用を提案しているのを見てきましたが、簡単に言えば、標準ライブラリ ソリューションが必要です。とにかく、サブプロセスやその他の stdlib はありますか? 上記で何を忘れていますか?

4

12 に答える 12

12

試す

proc.stdin.write('yourPassword\n')
proc.stdin.flush()

それはうまくいくはずです。

あなたが説明することstdin=Noneは、子プロセスが親(Pythonプログラム)の標準入力を継承する場所のように聞こえます。

于 2010-03-05T15:22:38.507 に答える
6

おそらく、代わりにexpectのようなライブラリを使用する必要がありますか?

たとえば、Pexpect ()。他にも同様の python ライブラリがあります。

于 2010-03-05T15:29:52.137 に答える
1

サブプロセス アプローチを破棄し、sftp アクセスに paramiko パッケージを使用することをお勧めします。

于 2010-03-05T18:42:48.433 に答える
0

これは、pexpect ではなく、expect を使用した純粋な Python ソリューションです。

Ubuntu の場合、最初に次のように期待してインストールする必要があります。

sudo apt install expect

Python 3.6 以降:

def sftp_rename(from_name, to_name):
    sftp_password = 'abigsecret'
    sftp_username = 'foo'
    destination_hostname = 'some_hostname'
    from_name = 'oldfilename.txt'
    to_name = 'newfilename.txt'
    commands = f"""
spawn sftp -o "StrictHostKeyChecking no" 
{sftp_username}@{destination_hostname}
expect "password:"
send "{sftp_password}\r"
expect "sftp>"
send "rename {from_name} {to_name}\r"
expect "sftp>"
send "bye\r"
expect "#"
"""
    sp = subprocess.Popen(['expect', '-c', commands], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
于 2018-08-10T06:18:01.433 に答える