Slide 1

Slide 1 text

Type Python, Press Enter, What Happens? Asheesh Laroia, Philip James (@asheeshlaroia, @phildini) PyCon 2015

Slide 2

Slide 2 text

Who are these guys?

Slide 3

Slide 3 text

paulproteus@vellum:~ $

Slide 4

Slide 4 text

paulproteus@vellum:~ $ python

Slide 5

Slide 5 text

paulproteus@vellum:~ $ python Python 2.7.6 (default, Apr 11 2014, 22:59:56) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>

Slide 6

Slide 6 text

paulproteus@vellum:~ $

Slide 7

Slide 7 text

paulproteus@vellum:~ $ python

Slide 8

Slide 8 text

paulproteus@vellum:~ $

Slide 9

Slide 9 text

paulproteus@vellum:~ $ echo $PATH

Slide 10

Slide 10 text

paulproteus@vellum:~ $ echo $PATH /home/paulproteus/bin:/usr/bin:/usr/local/bin:

Slide 11

Slide 11 text

paulproteus@vellum:~ $ echo $PATH /home/paulproteus/bin:/usr/bin:/usr/local/bin: paulproteus@vellum:~ $

Slide 12

Slide 12 text

paulproteus@vellum:~ $ echo $PATH /home/paulproteus/bin:/usr/bin:/usr/local/bin: paulproteus@vellum:~ $ python

Slide 13

Slide 13 text

paulproteus@vellum:~ $ echo $PATH /home/paulproteus/bin:/usr/bin:/usr/local/bin: paulproteus@vellum:~ $ python

Slide 14

Slide 14 text

paulproteus@vellum:~ $ echo $PATH /home/paulproteus/bin:/usr/bin:/usr/local/bin: paulproteus@vellum:~ $ python

Slide 15

Slide 15 text

paulproteus@vellum:~ $

Slide 16

Slide 16 text

paulproteus@vellum:~ $ hexdump -C /usr/bin/python

Slide 17

Slide 17 text

paulproteus@vellum:~ $ hexdump -C /usr/bin/python 00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 00000010 02 00 3e 00 01 00 00 00 55 49 57 00 00 00 00 00 |..>.....UIW.....| 00000020 40 00 00 00 00 00 00 00 08 15 33 00 00 00 00 00 |@.........3.....| 00000030 00 00 00 00 40 00 38 00 09 00 40 00 1c 00 1b 00 |[email protected]...@.....| 00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 |........@.......| 00000050 40 00 40 00 00 00 00 00 40 00 40 00 00 00 00 00 |@.@.....@.@.....| 00000060 f8 01 00 00 00 00 00 00 f8 01 00 00 00 00 00 00 |................| 00000070 08 00 00 00 00 00 00 00 03 00 00 00 04 00 00 00 |................| 00000080 38 02 00 00 00 00 00 00 38 02 40 00 00 00 00 00 |8.......8.@.....| 00000090 38 02 40 00 00 00 00 00 1c 00 00 00 00 00 00 00 |8.@.............|

Slide 18

Slide 18 text

paulproteus@vellum:~ $

Slide 19

Slide 19 text

paulproteus@vellum:~ $ file /usr/bin/python

Slide 20

Slide 20 text

paulproteus@vellum:~ $ file /usr/bin/python /usr/bin/python: ELF 64-bit LSB executable

Slide 21

Slide 21 text

for dir in os.getenv( 'PATH').split(':'): try: os.stat(dir + '/python') return dir except: pass raise CommandNotFound()

Slide 22

Slide 22 text

bash pid: 1221

Slide 23

Slide 23 text

bash pid: 1221 paulproteus@vellum:~ $

Slide 24

Slide 24 text

bash pid: 1221 paulproteus@vellum:~ $ exec python

Slide 25

Slide 25 text

python pid: 1221

Slide 26

Slide 26 text

python pid: 1221

Slide 27

Slide 27 text

python pid: 1221 paulproteus@vellum:~ $

Slide 28

Slide 28 text

python pid: 1221 paulproteus@vellum:~ $ [Process completed]

Slide 29

Slide 29 text

bash pid: 1221

Slide 30

Slide 30 text

bash pid: 1221 fork()

Slide 31

Slide 31 text

bash pid: 1221 fork() bash pid: 1222

Slide 32

Slide 32 text

bash pid: 1221 fork() bash pid: 1222 exec()

Slide 33

Slide 33 text

bash pid: 1221 fork() python pid: 1222 exec()

Slide 34

Slide 34 text

paulproteus@vellum:~ $

Slide 35

Slide 35 text

paulproteus@vellum:~ $ pstree

Slide 36

Slide 36 text

paulproteus@vellum:~ $ pstree init─┬ ... ├─cron ... └─sshd─┬─bash───python └─bash───pstree

Slide 37

Slide 37 text

Process Creation 1. Find binary in $PATH 2. Fork 3. Exec

Slide 38

Slide 38 text

paulproteus@vellum:~ $ python -v

Slide 39

Slide 39 text

# installing zipimport hook import zipimport # builtin # installed zipimport hook # /usr/lib/python2.7/site.pyc matches /usr/lib/python2.7/site.py import site # precompiled from /usr/ lib/python2.7/site.pyc # /usr/lib/python2.7/os.pyc matches /usr/lib/python2.7/os.py paulproteus@vellum:~ $ python -v

Slide 40

Slide 40 text

bash pid: 1221 fork() python pid: 1222 exec( ‘/usr/bin/python’, [‘python’, ‘-v’] )

Slide 41

Slide 41 text

bash pid: 1221 fork() python pid: 1222 argv = [‘python’, ‘-v’] exec( ‘/usr/bin/python’, [‘python’, ‘-v’] )

Slide 42

Slide 42 text

python pid: 1222 argv = [‘python’]

Slide 43

Slide 43 text

Python 2.7.6 (default, Apr 11 2014, 22:59:56) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

/dev/pts/3

Slide 46

Slide 46 text

python pid: 1222 0: /dev/pts/3

Slide 47

Slide 47 text

python pid: 1222 0: /dev/pts/3 stdin

Slide 48

Slide 48 text

python pid: 1222 0: /dev/pts/3 2

Slide 49

Slide 49 text

python pid: 1222 0: /dev/pts/3 termios 2

Slide 50

Slide 50 text

python pid: 1222 0: /dev/pts/3 termios 2

Slide 51

Slide 51 text

paulproteus@vellum:~ $

Slide 52

Slide 52 text

paulproteus@vellum:~ $ strace python

Slide 53

Slide 53 text

paulproteus@vellum:~ $ strace python [...] read(0,

Slide 54

Slide 54 text

paulproteus@vellum:~ $ strace python [...] read(0, 2

Slide 55

Slide 55 text

paulproteus@vellum:~ $ strace python [...] read(0, “2”, 1) 2

Slide 56

Slide 56 text

paulproteus@vellum:~ $ strace python [...] read(0, “2”, 1) read(0, 2

Slide 57

Slide 57 text

paulproteus@vellum:~ $ strace python [...] read(0, “2”, 1) read(0, 2 +

Slide 58

Slide 58 text

paulproteus@vellum:~ $ strace python [...] read(0, “2”, 1) read(0, “+”, 1) 2 +

Slide 59

Slide 59 text

paulproteus@vellum:~ $ strace python [...] read(0, “2”, 1) read(0, “+”, 1) read(0, “2”, 1) read(0, “\n”, 1) 2 + 2 Enter

Slide 60

Slide 60 text

while True: line = ‘’ chr = sys.stdin.read(1) line += chr if chr == ‘\n’: print eval(line)

Slide 61

Slide 61 text

while True: line = ‘’ chr = sys.stdin.read(1) line += chr if chr == ‘\n’: print eval(line)

Slide 62

Slide 62 text

python pid: 1222 0: /dev/pts/3 1: /dev/pts/3 2: /dev/pts/3

Slide 63

Slide 63 text

bash pid: 1221 python pid: 1222 0: /dev/pts/3 1: /dev/pts/3 2: /dev/pts/3 0: /dev/pts/3 1: /dev/pts/3 2: /dev/pts/3

Slide 64

Slide 64 text

bash pid: 1221 python pid: 1222 0: /dev/pts/3 1: /dev/pts/3 2: /dev/pts/3 0: /dev/pts/3 1: /dev/pts/3 2: /dev/pts/3 foreground

Slide 65

Slide 65 text

Special Types of Input

Slide 66

Slide 66 text

Ctrl C

Slide 67

Slide 67 text

Ctrl C termios

Slide 68

Slide 68 text

sigint Ctrl C termios

Slide 69

Slide 69 text

python pid: 1222 sigint Ctrl C termios

Slide 70

Slide 70 text

>>>

Slide 71

Slide 71 text

>>> Crtl C

Slide 72

Slide 72 text

>>> Crtl C KeyboardInterrupt >>>

Slide 73

Slide 73 text

python pid: 1222 sigint

Slide 74

Slide 74 text

python pid: 1222 sigint sig pipe

Slide 75

Slide 75 text

cat pid: 1222 0: /dev/pts/3 Ctrl D termios

Slide 76

Slide 76 text

cat pid: 1222 0: /dev/pts/3 Ctrl D termios

Slide 77

Slide 77 text

python pid: 1222 0: /dev/pts/3 Ctrl D termios

Slide 78

Slide 78 text

>>> import sys >>> sys.exit()

Slide 79

Slide 79 text

>>> raise SystemExit()

Slide 80

Slide 80 text

paulproteus@vellum:~ $ strace python

Slide 81

Slide 81 text

paulproteus@vellum:~ $ strace python [...] exit(0

Slide 82

Slide 82 text

paulproteus@vellum:~ $ strace python [...] exit(0 paulproteus@vellum:~ $

Slide 83

Slide 83 text

paulproteus@vellum:~ $ strace python [...] exit(0 paulproteus@vellum:~ $ echo $?

Slide 84

Slide 84 text

paulproteus@vellum:~ $ strace python [...] exit(0 paulproteus@vellum:~ $ echo $? 0

Slide 85

Slide 85 text

>>> import sys >>> sys.exit(1)

Slide 86

Slide 86 text

>>> import sys >>> sys.exit(1) paulproteus@vellum:~ $ echo $? 1

Slide 87

Slide 87 text

bash pid: 1221

Slide 88

Slide 88 text

python pid: 1222 argv = [‘python’] bash pid: 1221

Slide 89

Slide 89 text

python pid: 1222 argv = [‘python’] 0: /dev/pts/3 1: /dev/pts/3 2: /dev/pts/3 bash pid: 1221

Slide 90

Slide 90 text

python pid: 1222 argv = [‘python’] sigint sig pipe 0: /dev/pts/3 1: /dev/pts/3 2: /dev/pts/3 bash pid: 1221

Slide 91

Slide 91 text

Be Curious! • pstree • strace • file/hexdump

Slide 92

Slide 92 text

Talks to explore more • Systems Programming as a Swiss Army Knife (Julia Evans, Room 517c, Saturday @1050am)* • Exploring is never boring: understanding CPython without reading the code (Allison Kaptur, Room 710a, Saturday @ 245pm) • Where in your RAM is "python san_diego.py”? (Ying Li, Room 517c, Sunday @ 110pm) • Getting comfortable with web security: A hands-on session (Asheesh Laroia, Jacky Chang, Nicole Zuckerman, Room 512cg, Thursday @ 9am)* • Finding Spammers & Scammers through Rate Tracking with Python & Redis (Mica Swyers, Jay Chan, Room 511, Sunday @ 150pm) Talks by friends *time machine may be required

Slide 93

Slide 93 text

Questions? Thanks! Asheesh Laroia, Philip James (@asheeshlaroia, @phildini)