Add weblink script to easily share some files with a small webserver.
This commit is contained in:
parent
f7d9f7db2b
commit
37d0448fb4
15
README.md
15
README.md
|
@ -14,6 +14,7 @@ Some useful scripts (for me) that can be added to $PATH :)
|
||||||
* test_ssl3: Test if a website supportes the SSLV3 protocol.
|
* test_ssl3: Test if a website supportes the SSLV3 protocol.
|
||||||
* veille.sh: Kill every sensitive process and files then lock the screen.
|
* veille.sh: Kill every sensitive process and files then lock the screen.
|
||||||
* vimmanpager: Tiny script can be used as PAGER, it will call VIM!
|
* vimmanpager: Tiny script can be used as PAGER, it will call VIM!
|
||||||
|
* weblink: Tiny Python script that run a small webserver to share files.
|
||||||
* wol: Send WakeOnLan/magic packets to remote host.
|
* wol: Send WakeOnLan/magic packets to remote host.
|
||||||
* zenity_generator: Script to generate zenity window.
|
* zenity_generator: Script to generate zenity window.
|
||||||
* zfSnap.sh: Take snapshot of a ZFS pool.
|
* zfSnap.sh: Take snapshot of a ZFS pool.
|
||||||
|
@ -58,3 +59,17 @@ You could also use a nmap command:
|
||||||
nmap --script ssl-enum-ciphers -p 443 ldap.tld.org | grep "SSLv3: No supported ciphers found"
|
nmap --script ssl-enum-ciphers -p 443 ldap.tld.org | grep "SSLv3: No supported ciphers found"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Weblink
|
||||||
|
Python program that run a small webserver (BaseHTTPServer) to easily share some files.
|
||||||
|
* eg:
|
||||||
|
```sh
|
||||||
|
weblink /tmp/goodbye.file
|
||||||
|
HTTP server running at http://localhost:8888/
|
||||||
|
^C^C received, shutting down server
|
||||||
|
```
|
||||||
|
* With a password:
|
||||||
|
```sh
|
||||||
|
weblink --pass=die /tmp/kitty.file
|
||||||
|
HTTP server running at http://localhost:8888/die
|
||||||
|
```
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright 2008 (C) Pierre Duquesne <stackp@online.fr>
|
||||||
|
# Licensed under the Python Software Foundation License
|
||||||
|
# (http://www.python.org/psf/license/)
|
||||||
|
|
||||||
|
# 20081219 - Initial release
|
||||||
|
|
||||||
|
import BaseHTTPServer
|
||||||
|
import SocketServer
|
||||||
|
import mimetypes
|
||||||
|
import optparse
|
||||||
|
import socket
|
||||||
|
socket.setdefaulttimeout(3 * 60)
|
||||||
|
import urllib
|
||||||
|
import shutil
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
files = {}
|
||||||
|
password = ""
|
||||||
|
|
||||||
|
def make_index():
|
||||||
|
keys = files.keys()
|
||||||
|
keys.sort()
|
||||||
|
if password:
|
||||||
|
root = '/' + password + '/'
|
||||||
|
else:
|
||||||
|
root = '/'
|
||||||
|
return ('<html><body><pre>' +
|
||||||
|
'\n'.join(['<a href="%s">%s</a>' % (root + f, f) for f in keys])+
|
||||||
|
'</pre></body></html>').encode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
class HTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
||||||
|
|
||||||
|
protocol_version = "HTTP/1.0"
|
||||||
|
|
||||||
|
def do_GET(self):
|
||||||
|
path = urllib.unquote(self.path)
|
||||||
|
if password != '':
|
||||||
|
if path[:len(password)+1] != '/' + password:
|
||||||
|
return
|
||||||
|
path = path[len(password)+1:]
|
||||||
|
|
||||||
|
if path.lstrip('/') == '':
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-type', 'text/html; charset=utf-8')
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(make_index())
|
||||||
|
else:
|
||||||
|
filename = path.lstrip('/')
|
||||||
|
if filename in files:
|
||||||
|
localpath = files[filename]
|
||||||
|
f = open(localpath, 'rb')
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-type',
|
||||||
|
mimetypes.guess_type(localpath)[0])
|
||||||
|
self.send_header('Content-length', os.fstat(f.fileno())[6])
|
||||||
|
self.end_headers()
|
||||||
|
shutil.copyfileobj(f, self.wfile)
|
||||||
|
else:
|
||||||
|
self.send_response(404)
|
||||||
|
self.end_headers()
|
||||||
|
|
||||||
|
|
||||||
|
class ThreadedHTTPServer(SocketServer.ThreadingMixIn,
|
||||||
|
BaseHTTPServer.HTTPServer):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def parse_args():
|
||||||
|
"Parse command-line arguments."
|
||||||
|
usage = "weblink [options] FILE1 [FILE2 ...]"
|
||||||
|
parser = optparse.OptionParser(usage=usage)
|
||||||
|
parser.add_option('-p', dest='port', type='int', default=8888,
|
||||||
|
help="set the port")
|
||||||
|
parser.add_option('--pass', dest='password', default=None,
|
||||||
|
help="set the url-based password")
|
||||||
|
parser.add_option('--randompass', dest='randompass', default=False,
|
||||||
|
action='store_true',
|
||||||
|
help="generate a random url-based password")
|
||||||
|
options, remainder = parser.parse_args(sys.argv[1:])
|
||||||
|
return options, remainder
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
|
||||||
|
options, args = parse_args()
|
||||||
|
|
||||||
|
if options.password:
|
||||||
|
password = options.password
|
||||||
|
|
||||||
|
if options.randompass:
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
charset = string.ascii_letters + string.digits
|
||||||
|
password = ''.join(random.sample(charset, 30))
|
||||||
|
|
||||||
|
port = options.port
|
||||||
|
|
||||||
|
# -- Insert file names in the global dictionary ``files``
|
||||||
|
for f in args:
|
||||||
|
|
||||||
|
if not os.path.exists(f):
|
||||||
|
print "%s does not exist, skipping." % f
|
||||||
|
continue
|
||||||
|
|
||||||
|
if os.path.isdir(f):
|
||||||
|
print "%s is a directory, skipping." % f
|
||||||
|
continue
|
||||||
|
|
||||||
|
base = os.path.basename(f)
|
||||||
|
|
||||||
|
# Get a unique name for the file
|
||||||
|
# (for example, /a/file.txt and /b/file.txt will be called
|
||||||
|
# file.txt and file-1.txt)
|
||||||
|
i = 1
|
||||||
|
root, ext = os.path.splitext(base)
|
||||||
|
while (base in files):
|
||||||
|
base = "%s-%d%s" % (root, i, ext)
|
||||||
|
i = i+1
|
||||||
|
|
||||||
|
files[base] = f
|
||||||
|
|
||||||
|
print ""
|
||||||
|
print "HTTP server running at http://localhost:%d/%s" % (port, password)
|
||||||
|
try:
|
||||||
|
ThreadedHTTPServer(('', port), HTTPRequestHandler).serve_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print '^C received, shutting down server'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue