programing

Python 스크립트 내에서 curl 명령 실행

goodsources 2023. 10. 8. 09:50
반응형

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의 대답은 효과가 있습니다.하지만 피토닉처럼 보이진 않죠?작은 부탁 하나에도 많은 일이 필요합니다.파이썬은 비행기를 타야해요!글을 쓰는 사람들은 아마 그들이 그저 그들을 바라기를 바랄 것입니다.calld'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

반응형