2015-05-17 4 views
1

Я недавно купил книгу, чтобы начать играть немного с питоном и одним из сценариев заключается в следующем:Python ошибка: команда не найдена

#!/usr/bin/python2.7 
import sys 
import socket 
import getopt 
import threading 
import subprocess 


# define some global variables 
listen    = False 
command   = False 
upload    = False 
execute   = "" 
target    = "" 
upload_destination = "" 
port    = 0 

# this runs a command and returns the output 
def run_command(command): 

    # trim the newline 
    command = command.rstrip() 

    # run the command and get the output back 
    try: 
     output = subprocess.check_output(command,stderr=subprocess.STDOUT, shell=True) 
    except: 
     output = "Failed to execute command.\r\n" 

    # send the output back to the client 
    return output 

# this handles incoming client connections 
def client_handler(client_socket): 
    global upload 
    global execute 
    global command 

    # check for upload 
    if len(upload_destination): 

     # read in all of the bytes and write to our destination 
     file_buffer = "" 

     # keep reading data until none is available 
     while True: 
      data = client_socket.recv(1024) 

      if not data: 
       break 
      else: 
       file_buffer += data 

     # now we take these bytes and try to write them out 
     try: 
      file_descriptor = open(upload_destination,"wb") 
      file_descriptor.write(file_buffer) 
      file_descriptor.close() 

      # acknowledge that we wrote the file out 
      client_socket.send("Successfully saved file to %s\r\n" % upload_destination) 
     except: 
      client_socket.send("Failed to save file to %s\r\n" % upload_destination) 



    # check for command execution 
    if len(execute): 

     # run the command 
     output = run_command(execute) 

     client_socket.send(output) 


    # now we go into another loop if a command shell was requested 
    if command: 

     while True: 
      # show a simple prompt 
      client_socket.send("<BHP:#> ") 

      # now we receive until we see a linefeed (enter key) 
      cmd_buffer = "" 
      while "\n" not in cmd_buffer: 
       cmd_buffer += client_socket.recv(1024) 


      # we have a valid command so execute it and send back the results 
      response = run_command(cmd_buffer) 

      # send back the response 
      client_socket.send(response) 

# this is for incoming connections 
def server_loop(): 
    global target 
    global port 

    # if no target is defined we listen on all interfaces 
    if not len(target): 
     target = "0.0.0.0" 

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server.bind((target,port)) 

    server.listen(5)   

    while True: 
     client_socket, addr = server.accept() 

     # spin off a thread to handle our new client 
     client_thread = threading.Thread(target=client_handler,args=(client_socket,)) 
     client_thread.start() 


# if we don't listen we are a client....make it so. 
def client_sender(buffer): 

    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

    try: 
     # connect to our target host 
     client.connect((target,port)) 

     # if we detect input from stdin send it 
     # if not we are going to wait for the user to punch some in 

     if len(buffer): 

      client.send(buffer) 

     while True: 

      # now wait for data back 
      recv_len = 1 
      response = "" 

      while recv_len: 
       data  = client.recv(4096) 
       recv_len = len(data) 
       response+= data 

       if recv_len < 4096: 
        break 

      print response, 

      # wait for more input 
      buffer = raw_input("") 
      buffer += "\n"       

      # send it off 
      client.send(buffer) 


    except: 
     # just catch generic errors - you can do your homework to beef this up 
     print "[*] Exception! Exiting." 

     # teardown the connection     
     client.close() 




def usage(): 
    print "Netcat Replacement" 
    print 
    print "Usage: bhpnet.py -t target_host -p port" 
    print "-l --listen    - listen on [host]:[port] for incoming connections" 
    print "-e --execute=file_to_run - execute the given file upon receiving a connection" 
    print "-c --command    - initialize a command shell" 
    print "-u --upload=destination - upon receiving connection upload a file and write to [destination]" 
    print 
    print 
    print "Examples: " 
    print "bhpnet.py -t 192.168.0.1 -p 5555 -l -c" 
    print "bhpnet.py -t 192.168.0.1 -p 5555 -l -u=c:\\target.exe" 
    print "bhpnet.py -t 192.168.0.1 -p 5555 -l -e=\"cat /etc/passwd\"" 
    print "echo 'ABCDEFGHI' | ./bhpnet.py -t 192.168.11.12 -p 135" 
    sys.exit(0) 


def main(): 
    global listen 
    global port 
    global execute 
    global command 
    global upload_destination 
    global target 

    if not len(sys.argv[1:]): 
     usage() 

    # read the commandline options 
    try: 
     opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:",["help","listen","execute","target","port","command","upload"]) 
    except getopt.GetoptError as err: 
     print str(err) 
     usage() 


    for o,a in opts: 
     if o in ("-h","--help"): 
      usage() 
     elif o in ("-l","--listen"): 
      listen = True 
     elif o in ("-e", "--execute"): 
      execute = a 
     elif o in ("-c", "--commandshell"): 
      command = True 
     elif o in ("-u", "--upload"): 
      upload_destination = a 
     elif o in ("-t", "--target"): 
      target = a 
     elif o in ("-p", "--port"): 
      port = int(a) 
     else: 
      assert False,"Unhandled Option" 


    # are we going to listen or just send data from stdin 
    if not listen and len(target) and port > 0: 

     # read in the buffer from the commandline 
     # this will block, so send CTRL-D if not sending input 
     # to stdin 
     buffer = sys.stdin.read() 

     # send data off 
     client_sender(buffer) 

    # we are going to listen and potentially 
    # upload things, execute commands and drop a shell back 
    # depending on our command line options above 
    if listen: 
     server_loop() 

main() 

Я отлажена сценарий и попытаться запустить его в терминале но похоже, что он висит на некоторое время, а затем я получаю следующее сообщение об ошибке:

./bhnet.py: line 10: listen: command not found 
./bhnet.py: line 11: =: command not found 
./bhnet.py: line 12: upload: command not found 
./bhnet.py: line 13: execute: command not found 
./bhnet.py: line 14: target: command not found 
./bhnet.py: line 15: upload_destination: command not found 
./bhnet.py: line 16: port: command not found 
./bhnet.py: line 19: syntax error near unexpected token `(' 
./bhnet.py: line 19: `def run_command(command):' 

Я проверил код с одной в книге и даже фактический код, так что я не пытался, что хорошо, но все еще ничего. Хотел бы я быть более конкретным, чем это. Мы ценим любые предложения. Благодарю.

+2

Это работает, если вы попытаетесь запустить 'python bhnet.py' вместо'./Bhnet.py'? – leekaiinthesky

+3

Похоже, что он выполняет скрипт python как скрипт оболочки. – cdarke

+0

Спасибо @leekaiinthesky. Не возражаете ли вы объяснить, почему это происходит? В книге используется ./bhnet.py. Спасибо, ребята, – John

ответ

2

Это не в моем опыте, но я постараюсь пролить свет на него.

Справочная информация

При запуске сценария в Unix-подобных системах, как правило, вы можете позвонить в программу переводчик с пути к скрипту передается в качестве аргумента, например, python bhnet.py.

Однако, если у вас есть что-то настроенное, вы также можете запустить свой скрипт как отдельный исполняемый файл: ./bhnet.py. Для того, чтобы сделать это, вам вообще нужно:

  1. Убедитесь, что выполнить разрешения включены (chmod +x или эквивалент).

  2. Запустите первую строку в скрипте с символами #! (называемый «shebang»), за которым следует путь к используемому интерпретатору.

Ваш случай

Первая строка в вашем файле #!/usr/bin/python2.7, который выглядит достаточно правдоподобно. Что должно произойти при запуске ./bhnet.py, так это то, что интерпретатор в /usr/bin/python2.7 должен использоваться для запуска вашего скрипта. Пока /usr/bin/python2.7 является интерпретатор Python, он должен быть хорошо ...

Однако, как представляется, происходит в том, что любой интерпретатор вызывается при запуске ./bhnet.py пытается запустить сценарий как сценарий оболочки, а не как Python. Возможно, что-то на самом деле на пути /usr/bin/python2.7 по какой-то причине не является Python. Или, возможно, ваш файл на самом деле не начинается с того, что вы вставили в вопрос, но, может быть, вы случайно перезаписали первую строку в своем файле с помощью другой директивы интерпретатора, например #!/bin/sh? Возможно, есть и другие вещи, которые могут вызвать это.

В любом случае, независимо от вашего по умолчанию python, похоже, работает нормально. (Для того, чтобы увидеть, что ваши очки по умолчанию, вы можете запустить which python.)

Рекомендация

Если вы хотите, чтобы запустить файл как отдельный исполняемый файл (т.е../bhnet.py), попробуйте изменить первую строку:

#!/usr/bin/env python 

Это кажется recommended shebang line for Python, и он должен работать нормально в вашем случае. Но мне все равно было бы интересно узнать, что случилось с вашим /usr/bin/python2.7.

+1

Кажется, что-то в этом роде, но спасибо за подтверждение этого для меня, а также за большой уровень детализации. Я проверю его, когда у меня появится шанс и опубликую результаты. – John

Смежные вопросы