2014-10-18 1 views
0

스크립트를 실행하는 데 문제가 있습니다.스크립트가 ssh를 통해 로컬에 저장되지 않습니다.

이 명령 줄에서 완벽하게 작동합니다 :이 스크립트를 사용하는 경우에는

ssh [email protected] /usr/sbin/tcpdump -i eth0 -w - | /usr/sbin/tcpdump -r - -w /home/cuckoo/cuckoo/storage/analyses/1/saveit.pcap 

! #을 그것은 원격에 모두 tcpdump를 프로세스를 생성합니다

import sys 
import os 
import subprocess 

cmd = [] 
remote_cmd = [] 
local_cmd = [] 
connect_cmd = [] 
outfile = None 

try: 
    connect_cmd = str.split(os.environ["RTCPDUMP_CMD"], " ") 
except: 
    connect_cmd = str.split("ssh [email protected]", " ") 

remote_cmd.extend(str.split("/usr/sbin/tcpdump -w -", " ")) 
local_cmd.extend(str.split("/usr/sbin/tcpdump -r -", " ")) 

for argument in xrange(1, len(sys.argv)): 
    if sys.argv[argument] == "-w": 
     outfile=sys.argv[argument+1] 
     sys.argv[argument] = None 
     sys.argv[argument+1] = None 

    if sys.argv[argument] == "-i": 
     remote_cmd.append(sys.argv[argument]) 
     remote_cmd.append(sys.argv[argument+1]) 
     sys.argv[argument] = None 
     sys.argv[argument+1] = None 

    if not sys.argv[argument] == None: 
     if " " in sys.argv[argument]: 
      local_cmd.append("'" + sys.argv[argument] + "'") 
      remote_cmd.append("'" + sys.argv[argument] + "'") 
     else: 
      local_cmd.append(sys.argv[argument]) 
      remote_cmd.append(sys.argv[argument]) 

if not outfile == None: 
    local_cmd.insert(1, "-w") 
    local_cmd.insert(2, outfile) 

cmd.extend(connect_cmd) 
cmd.extend(remote_cmd) 
cmd.append("|") 
cmd.extend(local_cmd) 

try: 
    subprocess.call(cmd) 
except KeyboardInterrupt: 
    exit(0) 

는/usr/빈/ENV 파이썬 호스트가되고 두 ​​번째 tcpdump가 작동하지 않는 경로로 인해 저장되지 않습니다. 나는 마지막에 print cmd를 추가했고 프롬프트에 전달되는 ssh 명령은 똑같습니다 (스크립트 자체를 실행할 때 뻐꾸기는 스크립트를 호출 할 때 많은 옵션을 전달합니다. 또한 -w 전에 - 내가 eth0,하지만 난 그것을 테스트하고 그것은뿐만 아니라 명령 줄에서 작동).

그래서 완전히 왜곡되었습니다. 왜 파이프가 로컬에서는 스크립트에서 작동하지 않지만 프롬프트에서는 작동합니까?

아, 그리고 스크립트의 신용 그래서 내가 철저하게 난처한 상황에 빠진 http://blog.michaelboman.org/2013/02/making-cuckoo-sniff-remotely.html

+0

매우 읽을 수없는 명시 적'self'와 str.split''같은 언 바운드 메서드를 호출; "str.split ("ssh root @ fw "," ")'대신''ssh root @ fw".split ("")이 아닌 왜? 또한, 왜'split()'대신에'split ("")'을 사용해야합니까? (정말로, 아마도 shlex.split을 원할 것입니다. 언젠가는 당신이 어딘가에 인용 된 인수를 추가 할 것이고'str.split'이 잘못된 것을 할 것이기 때문입니다 ...) – abarnert

+0

그래, 솔직히 말해서 나는 이제 막 시작하고있다. 파이썬 배우기. 이 스크립트를 발견하고 내가 설정했던 실험실 환경에 맞도록 실행하려고했습니다. –

답변

0

, 왜 지역에 파이프가 스크립트에서 작동하지 않습니다하지만 프롬프트에서 작동합니다 마이클 Boman에 속해?

파이프는 쉘에 의해 처리되고 쉘을 실행하지 않기 때문에.

도큐멘트를 보면 Replacing Older Functions with the subprocess Module 아래에서 쉘 파이프 라인과 동일한 작업을 수행하는 방법을 설명합니다. 여기에 예제 :

output=`dmesg | grep hda` 
# becomes 
p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
output = p2.communicate()[0] 

그래서, 당신의 측면에서 : 보조 노트로

cmd.extend(connect_cmd) 
cmd.extend(remote_cmd) 
try: 
    remote = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
    local = subprocess.Popen(local_cmd, stdin=remote.stdout) 
    remote.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
    local.communicate() 
except KeyboardInterrupt: 
    exit(0) 
+0

감사합니다! 그게 잘됐다! –

관련 문제