使用子进程发送密码

The*_*Jug 18 python sftp subprocess

我正在尝试使用python子进程模块登录到一个安全的ftp站点,然后获取一个文件.但是,我一直在试图在请求密码时发送密码.到目前为止,我有以下代码:

from subprocess import Popen, PIPE

proc = Popen(['sftp','user@server', 'stop'], stdin=PIPE)
proc.communicate('password')
Run Code Online (Sandbox Code Playgroud)

这仍然在密码提示符处停止.如果我手动输入密码,则转到ftp站点,然后在命令行输入密码.我见过人们建议使用pexpect,但长话短说我需要一个标准的库解决方案.无论如何还有子进程和/或任何其他stdlib?我上面忘记了什么?

cod*_*ape 8

也许您应该使用类似期望的库?

例如Pexpect(例子).还有其他类似的python库.

  • -1因为问题特别要求标准的Python库解决方案,而不是pexpect.只是在说'. (19认同)
  • `example` 链接 http://www.noah.org/wiki/Pexpect#Overview 现在已经死了;我想和 https://pexpect.readthedocs.io/en/stable/examples.html 一样 (2认同)

Aar*_*lla 7

尝试

proc.stdin.write('yourPassword\n')
proc.stdin.flush()
Run Code Online (Sandbox Code Playgroud)

这应该工作.

你所描述的内容听起来就像stdin=None子进程继承了父进程的stdin(你的Python程序).

  • 嗯...这似乎仍然是停止并询问密码。 (2认同)
  • 据我所知,密码不是通过标准输入写入的.此代码是否经过测试? (2认同)
  • @SebastianGabrielVinci 是的。大多数程序在等待密码时将控制台置于 RAW/NOECHO 模式,因此您看不到它,但它们都从标准输入读取。一些代码还会检查 stdin 是否为 tty。对于那些,您需要使用伪 tty。 (2认同)

小智 6

from subprocess import Popen, PIPE\n\nproc = Popen(['sftp','user@server', 'stop'], stdin=PIPE)\nproc.communicate(input='password')\n
Run Code Online (Sandbox Code Playgroud)\n\n

尝试在通信中使用 input=\xe2\x80\x98password\xe2\x80\x99 ,这对我有用。

\n


Mat*_*sen 5

用于ParamikoSFTP。对于其他任何事情,这都有效:

import subprocess

args = ['command-that-requires-password', '-user', 'me']

proc = subprocess.Popen(args, 
                        stdin=subprocess.PIPE, 
                        stdout=subprocess.PIPE, 
                        stderr=subprocess.PIPE)

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

stdout, stderr = proc.communicate()
print stdout
print stderr
Run Code Online (Sandbox Code Playgroud)