如何在subprocess.call()之后输入密码

时间:2014-11-09 04:58:52

标签: python subprocess

我正在尝试构建一个我每天都运行的python脚本来获取前两天来自OpenDNS的DNS请求。这就是我到目前为止所拥有的。

import subprocess
import datetime
two = datetime.date.today() - datetime.timedelta(2)
one = datetime.date.today() - datetime.timedelta(1)
path = '~/Downloads/opendns-fetchstats-master'
dateRange = str(two) + ' ' + str(one)
dateRange2 = str(two) + 'to' +str(one)
username = 'email@email.com'
password = 'password'
outputFile = dateRange2 + '.csv'
print dateRange2
subprocess.call(
    ['cd ' + str(path) + ' && echo '+ str(password) + ' | bash fetchstats ' +
    str(username) + ' home ' + str(dateRange) + ' > ' + str(outputFile)],
    shell=True
    )

问题是它运行后:

bash fetchstats ' + str(username) + ' <network_id> ' + str(dateRange) + ' > ' + str(outputFile)
然后它会要求输入帐户的密码。我无法弄清楚如何输入密码。我尝试使用

echo password |

部分工作但该过程返回下面的错误,并且该过程在所有数据可以下载之前结束

  

的stty:   标准输入:适用于设备的ioctl   stty:标准输入:设备不适当的ioctl

有没有办法可以写这个,以便进程在提示时输入密码,然后等到下载完成后再结束这个过程?

2 个答案:

答案 0 :(得分:0)

您应该考虑使用subprocess.Popen来控制stdin / stdout / stderr

还有this related question

答案 1 :(得分:0)

我发现使用:

echo password

有效并且可以忽略错误。我认为它在完成之前终止的原因是因为文件大小太小。在终端中手动运行相同日期范围后,文件大小匹配,这是由于该日期范围内可用的数据量很少。