If you invoke via 'env', then you can use scripts which are themselves
interpreted as interpreters. e.g.

#!/usr/bin/env /home/johnc/foo/flashbang

puts ARGV[0]


Jasper



On Wed, 2007-06-27 at 11:30 +1200, John Carter wrote:
> Some deeper mysteries of the the world of hash bangs....
> 
> Without cheating (trying to run it) what will this pair of files do under 
> Linux....
> 
> Here is a little script we want to be interpreted by the "flashbang" 
> interpreter...
> ===/home/johnc/foo/hashbang===========================================
> #!/home/johnc/foo/flashbang
> 
> 
> puts ARGV[0]
> 
> 
> ======================================================================
> 
> So we expect
>   ./hashbang "Hello World"
> to be formally equivalent to running...
> 
> /home/johnc/foo/flashbang ./hashbang "Hello World"
> 
> Now assume....
> 
> ===/home/johnc/foo/flashbang==========================================
> #!/bin/sh
> 
> echo flashbanger
> echo $0
> echo "$@"
> 
> /usr/bin/ruby "$@"
> ======================================================================
> 
> Let's try...
>   /home/johnc/foo/flashbang -e 'puts "Hello World"'
> 
> On my system the result is....
> flashbanger
> /home/johnc/foo/flashbang
> puts "Hello World"
> Hello World
> 
> No surprise...
> 
> Now what do you think happens if you say...?
> 
>    ./hashbang "Hello World"
> 
> Now what do you think happens if you say....?
> 
>    /home/johnc/foo/flashbang ./hashbang "Hello World"
> 
> 
> Scroll down for the answers...
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> .
> ./hashbang "Hello World"
> ./hashbang: line 4: puts: command not found
> 
> Surprise Number 1 : The binfmt look up code looks up flashbang and
> finds it's also a #! freaks out and just uses sh as the interpreter...
> 
> To check that lets try...
> ==hashcat=============================================================
> #!/home/johnc/foo/flashcat
> 
> 
> puts ARGV[0]
> 
> echo "Look, we must be running $SHELL"
> ======================================================================
>    and ==flashcat============================================================
> #!/bin/cat
> 
> echo flashbanger
> echo $0
> echo "$@"
> 
> /usr/bin/ruby "$@"
> ======================================================================
> 
> Then...
> ----------------------------------------------------------------------
>   ./hashcat "Hello World"
> ./hashcat: line 4: puts: command not found
> Look, we must be running /bin/bash
> ----------------------------------------------------------------------
> and...
> /home/johnc/foo/flashcat ./hashbang "Hello World"
> 
> Comes out as ...
> /bin/cat /home/johnc/foo/flashcat ./hashcat "Hello World"
> 
> Which results, no surprise as...
> ----------------------------------------------------------------------
> #!/bin/cat
> 
> echo flashbanger
> echo $0
> echo "$@"
> 
> /usr/bin/ruby "$@"
> #!/home/johnc/foo/flashbang
> 
> 
> puts ARGV[0]
> 
> /bin/cat: Hello World: No such file or directory
> ----------------------------------------------------------------------
> 
> 
> Now for Surprise #2
> ----------------------------------------------------------------------
> /home/johnc/foo/flashbang ./hashbang "Hello World" | head -20
> flashbanger
> /home/johnc/foo/flashbang
> ./hashbang Hello World
> flashbanger
> /home/johnc/foo/flashbang
> ./hashbang Hello World
> flashbanger
> /home/johnc/foo/flashbang
> ./hashbang Hello World
> flashbanger
> /home/johnc/foo/flashbang
> ./hashbang Hello World
> flashbanger
> /home/johnc/foo/flashbang
> ./hashbang Hello World
> flashbanger
> /home/johnc/foo/flashbang
> ./hashbang Hello World
> flashbanger
> /home/johnc/foo/flashbang
> ----------------------------------------------------------------------
> WHAT THE HELL!? Why?
> 
> Well, deep within ruby/ruby.c is a chunk of code that looks for a #!
> on the first line. If it contains the word "ruby" anywhere, it ignores
> it. If it doesn't it says, Oh dear. This one wasn't actually for me. I
> better be gnice and exec that interpreter and feed it this script...
> 
> All in all, you can tell I have a had rather exotic and frustrating
> day or three.
> 
> John Carter                             Phone : (64)(3) 358 6639
> Tait Electronics                        Fax   : (64)(3) 359 4632
> PO Box 1645 Christchurch                Email : [EMAIL PROTECTED]
> New Zealand
> 
-- 
Jasper Bryant-Greene <[EMAIL PROTECTED]>
Album Limited

Reply via email to