我正在尝试将一个快速脚本放在一起,我可以用它来检查最近x天内已经制作了哪些AWS EC2快照。
虽然我得到输出错误
/bin/sh: 1: /usr/local/bin/aws --profile dummydata0 ec2 describe-snapshots --owner-ids 000000000000 --filters Name=start-time,Values=2014-07-08*: not found
运行
/usr/local/bin/aws --profile dummydata0 ec2 describe-snapshots --owner-ids 000000000000 --filters Name=start-time,Values=2014-07-08*
在命令行工作正常,所以我猜我的基本Linux理解力正在下降。
这是我使用python ./script.py
#!/usr/bin/env python
import subprocess
import datetime
# Create your views here.
def main(numdays):
base = datetime.date.today()
date_list = [base - datetime.timedelta(days=x) for x in range(0, numdays)]
environment = {'dummydata0':'000000000000', 'dummydata1':'111111111111', 'dummydata2':'222222222222'}
data = []
for date in date_list:
date_string = str(date) + "*"
# Python 3 prefers .values to .itervalues
for key in environment:
call_snapshots = '"/usr/local/bin/aws --profile {0} ec2 describe-snapshots --owner-ids {1} --filters Name=start-time,Values={2}"'.format((key), (environment[key]), (date_string))
return subprocess.call(call_snapshots, shell=True)
main(7)
答案 0 :(得分:1)
你的字符串中有一对引号:
call_snapshots = '"/usr/local/bin/aws --profile {0} ec2 describe-snapshots --owner-ids {1} --filters Name=start-time,Values={2}"'.format((key), (environment[key]), (date_string))
所以shell将收到的实际命令是:
"/usr/local/bin/aws --profile ... etc."
这些引号指示shell将整行视为单个项目。它不会寻找名为aws
的程序,而是寻找一个名为aws --profile ....
且无法工作的程序。
您可以使用pipes.quote
正确引用您的参数(在Python 3中重命名为shlex.quote
)来解决此问题:
call_snapshots = '/usr/local/bin/aws --profile {0} ec2 describe-snapshots --owner-ids {1} --filters Name=start-time,Values={2}'.format(
*map(pipes.quote, (key, environment[key], date_string)))
return subprocess.call(call_snapshots, shell=True)
或者更好的方法是避免使用shell并将参数作为列表传递:
call_snapshots = ['/usr/local/bin/aws',
'--profile', key, 'ec2', 'describe-snapshots', '--owner-ids', environment[key],
'--filters', 'Name=start-time,Values=' + date_string]
return subprocess.call(call_snapshots)
[并且AWS没有这种东西的Python API吗?]