Narzędzia Net Admina: Nie masz TFTP-a – napisz go sobie sam

Protokół TFTP jest wykorzystywany na bardzo szeroką skalę w zarządzaniu urządzeniami infrastruktury sieciowej. Służy na przykład do ładowania systemu operacyjnego oraz inicjalizacji urządzeń aktywnych, w tym routerów i przełączników, przez sieć. Może też służyć do zapisywania i pobierania kopii zapasowych konfiguracji z centralnego repozytorium.

Przeważnie aTFTP-Serverktywne urządzenia sieciowe mogą działać w trybie klienta protokołu TFTP, choć na niektórych z nich da się również uruchamiać funkcje serwera. Tym niemniej znacznie wygodniej jest posiadać serwer na komputerze, na przykład na swoim laptopie wykorzystywanym także jako konsola przy wykonywaniu różnego rodzaju prac związanych z konfiguracją urządzeń. Wygodę takiego rozwiązania na pewno potwierdzi każdy administrator lub instalator urządzeń sieciowych.

Jeśli jednak na tym właśnie komputerze brak gotowego serwera TFTP, to absolutnie nic nie stoi na przeszkodzie, żeby w kilka minut napisać swoje własne rozwiązanie. Wystarczy posiadać interpreter Pythona oraz bibliotekę ‘tftpy’. Oczywiście rozwiązanie, o którym mowa  jest kompletnie bezkosztowe, a na dodatek kod skryptu pozostaje niezależny od systemu operacyjnego – można go bez modyfikacji uruchamiać dosłownie na wszystkich Winsows-ach, na Mac-u i w wszelkiego rodzaju Unix-ach.

Opracowałem skrypt serwera, ale powstał również do celów testowych kod klienta.

Oba skrypty, zarówno implementujący funkcje serwera jak i klienta, zostały napisane z myślą o uruchamianiu z poziomu linii poleceń powłoki systemu operacyjnego. Podpowiedź oczekiwanej, poprawnej składni wywołania można uzyskać wywołując skrypt z opcją –h lub –help.

Dla skryptu serwera wygląda to tak:

~janusz $ ./skrypty/tftpd.py -h

  _____ ___ _____ ___
 |_   _| __|_   _| _ \  ___ ___ _ ___ _____ _ _
   | | | _|  | | |  _/ (_-</ -_) '_\ V / -_) '_|
   |_| |_|   |_| |_|   /__/\___|_|  \_/\___|_|
  _______________________ by Janusz Nawrat (2015)                               

  Press Control-C to stop

usage: tftpd.py [-h] [-d DIRECTORY] [--version]

TFTP Server

optional arguments:
  -h, --help    show this help message and exit
  -d DIRECTORY  The server working directory
  --version     show program's version number and exit

Dla skryptu klienta wygląda to tak:

~janusz $ ./skrypty/tftpc.py -h

  _____ ___ _____ ___
 |_   _| __|_   _| _ \  __| (_)___ _ _| |_
   | | | _|  | | |  _/ / _| | / -_) ' \  _|
   |_| |_|   |_| |_|   \__|_|_\___|_||_\__|
  _________________ by Janusz Nawrat (2015)                                     

usage: tftpc.py [-h] [-o OPERATION] [-f FILENAME] [-i SERVER_IP] [--version]

TFTP client

optional arguments:
  -h, --help    show this help message and exit
  -o OPERATION  Type of operation: u - upload, d - download
  -f FILENAME   Filename to transfer
  -i SERVER_IP  The server IP address
  --version     show program's version number and exit

Oto kod źródłowy serwera:

#!/usr/bin/python                                      
import tftpy
import argparse, sys

banner = '''                                    
  _____ ___ _____ ___                           
 |_   _| __|_   _| _ \  ___ ___ _ ___ _____ _ _ 
   | | | _|  | | |  _/ (_-<\/ -_) '_\ V / -_) '_|
   |_| |_|   |_| |_|   /__/\___|_|  \_/\___|_|  
  _______________________ by Janusz Nawrat (2015)                                         

  Press Control-C to stop
'''

print banner
parser = argparse.ArgumentParser(description="TFTP Server")
    
parser.add_argument('-d', action='store', dest='directory',
                    help='The server working directory',
                    default='.')

parser.add_argument('--version', action='version', version='%(prog)s 1.0')

options = parser.parse_args()

directory = options.directory

try:
    server = tftpy.TftpServer(directory)
    print "[*] Server started"
    server.listen('0.0.0.0', 69)
except KeyboardInterrupt:
    print "[!] Control-C pressed"
    server.stop()
    print "[*] Server stopped"
    sys.exit(0)
except:
    print "[!] An error occurred and program will shut down"
    sys.exit(0)

Oto kod źródłowy klienta:

#!/usr/bin/python                                      
import tftpy
import argparse, sys

banner = '''                                    
  _____ ___ _____ ___                           
 |_   _| __|_   _| _ \  __| (_)___ _ _| |_ 
   | | | _|  | | |  _/ / _| | / -_) ' \  _|
   |_| |_|   |_| |_|   \__|_|_\___|_||_\__|
  _________________ by Janusz Nawrat (2015)                                         
'''

print banner
parser = argparse.ArgumentParser(description="TFTP client")
    
parser.add_argument('-o', action='store', dest='operation',
                    help='Type of operation: u - upload, d - download',
                    default='d')
                    
parser.add_argument('-f', action='store', dest='filename',
                    help='Filename to transfer',
                    default='')                    

parser.add_argument('-i', action='store', dest='server_ip',
                    help='The server IP address',
                    default='127.0.0.1')                                
                    
parser.add_argument('--version', action='version', version='%(prog)s 1.0')

options = parser.parse_args()

server_ip_address = options.server_ip

try:
    client = tftpy.TftpClient(server_ip_address, 69)
    if options.operation == 'd':
        try:    
            client.download(options.filename, options.filename)
            print "[+] Successful %s file download" % options.filename
        except:
            print "[-] An error occurred in file downloading from server"
    elif options.operation == 'u':
        try:    
            client.upload(options.filename, options.filename)
            print "[+] Successful %s file upload" % options.filename
        except:
            print "[-] An error occurred in file uploading to server"
    else:
        print "[!] Unknown operation type"
        sys.exit(1)
except:
    print "[!] An error occurred and program will shut down"
    sys.exit(1)

Zachęcam , jak zawsze, do eksperymentowania z kodem i jego dalszego rozwoju.

Informacje Janusz Nawrat
Just ordinary man who likes thinking...

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

TOMASZ WEŁNA

artysta grafik | wykładowca

PRACOWNIA OKO

Szkoła Rysunku Malarstwa i Grafiki DR TOMASZA WEŁNY | KRAKÓW | Plac Matejki 10 | tel 691 81 75 74

Piękno neurobiologii

Blog Jerzego Vetulaniego

Teoria muzyki, zasady muzyki, podstawy muzyki

Teoria muzyki, zasady muzyki, podstawy muzyki - czyli to co każdy amator muzyki wiedzieć powinien :)

Personal Development & Inspirations

Przemyślenia i refleksje, którymi warto się podzielić (blog by Janusz Nawrat)

Business IT Cooperation Platform

Biznes i IT - dwa światy, które muszą współdziałać

%d bloggers like this: