J'essaie d'exécuter une commande curl dans un script python.
Si je le fais dans le terminal, cela ressemble à ceci:
curl -X POST -d '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}' http://localhost:8080/firewall/rules/0000000000000001
J'ai vu des recommandations d'utiliser pycurl
, mais je ne savais pas comment l'appliquer à la mienne.
J'ai essayé d'utiliser:
subprocess.call([
'curl',
'-X',
'POST',
'-d',
flow_x,
'http://localhost:8080/firewall/rules/0000000000000001'
])
et cela fonctionne, mais y a-t-il un meilleur moyen?
Vous pouvez utiliser urllib comme @roippi a dit:
import urllib2
data = '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}'
url = 'http://localhost:8080/firewall/rules/0000000000000001'
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
for x in f:
print(x)
f.close()
Si vous ne modifiez pas trop la commande curl, vous pouvez également appeler directement la commande curl.
import shlex
cmd = '''curl -X POST -d '{"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"}' http://localhost:8080/firewall/rules/0000000000000001'''
args = shlex.split(cmd)
process = subprocess.Popen(args, Shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
Utilisez cet outil (hébergé ici gratuitement) pour convertir votre commande curl en code de requête Python équivalent:
Exemple: Ceci,
curl 'https://www.example.com/' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Origin: https://www.libib.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Cookie: SESSID=ABCDEF' --data-binary 'Pathfinder' --compressed
Se convertit parfaitement en:
import requests
cookies = {
'SESSID': 'ABCDEF',
}
headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Origin': 'https://www.libib.com',
'Accept-Encoding': 'gzip, deflate, br',
}
data = 'Pathfinder'
response = requests.post('https://www.example.com/', headers=headers, cookies=cookies, data=data)
En reformulant l’une des réponses de cet article, au lieu d’utiliser cmd.split (). Essayez d'utiliser:
import shlex
args = shlex.split(cmd)
Ensuite, alimentez args vers subprocess.Popen.
Consultez cette documentation pour plus d’informations: https://docs.python.org/2/library/subprocess.html#popen-constructor