Python 스크립트 내에서 curl 명령 실행
python 스크립트 내에서 curl 명령을 실행하려고 합니다.
터미널에서 하면 다음과 같습니다.
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
사용할 권장 사항을 확인했습니다.pycurl
, 제 것에 어떻게 적용해야 할지 모르겠어요.
다음을 사용해 보았습니다.
subprocess.call([
'curl',
'-X',
'POST',
'-d',
flow_x,
'http://localhost:8080/firewall/rules/0000000000000001'
])
효과는 있지만 더 좋은 방법은 없을까요?
하지마!
그건 아무도 원하지 않는 "답"이란 걸 알아요.하지만 뭔가 할 가치가 있다면, 할 가치가 있는 거죠?
이 좋은 생각처럼 보이는 것은 아마도 다음과 같은 셸 명령에 대한 꽤 광범위한 오해에서 기인할 것입니다.curl
프로그램 자체가 아닌 다른 것들입니다.
그래서 당신이 묻고 있는 것은 "어떻게 하면 이 다른 프로그램을 내 프로그램 내에서 실행할 수 있을까, 단지 약간의 웹 요청을 할 수 있을까?" 입니다.말도 안 돼요, 더 좋은 방법이 있을 거예요, 그렇죠?
물론, Uxio의 대답은 효과가 있습니다.하지만 피토닉처럼 보이진 않죠?작은 부탁 하나에도 많은 일이 필요합니다.파이썬은 비행기를 타야해요!글을 쓰는 사람들은 아마 그들이 그저 그들을 바라기를 바랄 것입니다.call
d'dcurl
!
효과는 있습니다만, 더 좋은 방법은 없을까요?
네, 더 좋은 방법이 있답니다!
요청사항: HTTP for Human
일이 이렇게 되면 안 됩니다.파이썬에는 없습니다.
이 페이지를 확인합니다.
import requests
res = requests.get('https://stackoverflow.com/questions/26000336')
그거야, 진짜!그럼 날것을 가지면 됩니다.res.text
, 아니면res.json()
산출량, 더res.headers
,기타.
모든 옵션 설정에 대한 자세한 내용은 문서(위 링크)에서 확인할 수 있습니다. OP가 지금쯤 진행되고 있다고 생각하기 때문에, 독자 여러분(지금의 독자)은 다른 옵션이 필요할 가능성이 높습니다.
하지만 예를 들어 다음과 같이 간단합니다.
url = 'http://example.tld'
payload = { 'key' : 'val' }
headers = {}
res = requests.post(url, data=payload, headers=headers)
멋진 파이썬 dict를 사용하여 GET 요청에 쿼리 문자열을 제공할 수도 있습니다.params={}
.
심플하고 우아합니다.침착하시고, 날아 가세요.
이 도구(여기서 무료로 호스팅)를 사용하여 컬 명령을 동등한 Python 요청 코드로 변환합니다.
예:이것.
curl 'https://www.example.com/' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Origin: https://www.example.com' -H 'Accept-Encoding: gzip, deflate, br' -H 'Cookie: SESSID=ABCDEF' --data-binary 'Pathfinder' --compressed
깔끔하게 다음으로 변환됩니다.
import requests
cookies = {
'SESSID': 'ABCDEF',
}
headers = {
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Origin': 'https://www.example.com',
'Accept-Encoding': 'gzip, deflate, br',
}
data = 'Pathfinder'
response = requests.post('https://www.example.com/', headers=headers, cookies=cookies, data=data)
@roippi가 말한 대로 urllib을 사용할 수 있습니다.
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()
curl 명령을 너무 많이 조정하지 않으면 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()
하위 프로세스로 시도
CurlUrl="curl 'https://www.example.com/' -H 'Connection: keep-alive' -H 'Cache-
Control: max-age=0' -H 'Origin: https://www.example.com' -H 'Accept-Encoding:
gzip, deflate, br' -H 'Cookie: SESSID=ABCDEF' --data-binary 'Pathfinder' --
compressed"
사용하다getstatusoutput
결과를 저장하다
status, output = subprocess.getstatusoutput(CurlUrl)
아래 코드 조각을 사용할 수 있습니다.
import shlex
import subprocess
import json
def call_curl(curl):
args = shlex.split(curl)
process = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
return json.loads(stdout.decode('utf-8'))
if __name__ == '__main__':
curl = '''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 '''
output = call_curl(curl)
print(output)
cmd.split()을 사용하는 대신 이 게시물의 답변 중 하나를 다시 구합니다.다음을 사용해 보십시오.
import shlex
args = shlex.split(cmd)
그런 다음 아르그를 서브프로세스에 공급합니다.팝펜.
자세한 내용은 이 문서를 확인하십시오. https://docs.python.org/2/library/subprocess.html#popen-constructor
subprocess
module,다라는 이 더 있습니다.run
from subprocess import run
run(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)
Python 3의 경우 내장 HTTP 프로토콜 클라이언트가 cURL의 실행 가능한 대안입니다. 제공된 예제를 사용하면 다음과 같습니다.
>>> import http.client, urllib.parse
>>> params = urllib.parse.urlencode({"nw_src": "10.0.0.1/32", "nw_dst": "10.0.0.2/32", "nw_proto": "ICMP", "actions": "ALLOW", "priority": "10"})
>>> headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
>>> conn = http.client.HTTPConnection("localhost:8080")
>>> conn.request("POST", "/firewall/rules/0000000000000001", params, headers)
>>> response = conn.getresponse()
>>> print(response.status, response.reason)
302 Found
>>> data = response.read()
>>> conn.close()
언급URL : https://stackoverflow.com/questions/26000336/execute-curl-command-within-a-python-script
'programing' 카테고리의 다른 글
XAMPP - 오류:MySQL이 예기치 않게 종료됨 (0) | 2023.10.08 |
---|---|
공백 및 특수 문자를 사용할 수 없도록 ang-pattern 쓰기 (0) | 2023.10.08 |
MySQL에서 데이터베이스 이름 와일드카드로 GRANT? (0) | 2023.10.08 |
RouteParam을 사용하는 컨트롤러 각도 테스트 (0) | 2023.10.08 |
스위프트에서 클래스 메소드/프로퍼티를 만들려면 어떻게 해야 합니까? (0) | 2023.10.08 |