python 2.7.12 on Linux behaving differently than on Windows

Marko Rauhamaa marko at pacujo.net
Mon Dec 5 15:14:17 EST 2016


Chris Angelico <rosuav at gmail.com>:
> On Tue, Dec 6, 2016 at 4:23 AM, Marko Rauhamaa <marko at pacujo.net> wrote:
>> Bash is nice, too nice. It makes it easy to write code that's riddled
>> with security holes. The glorious Unix tradition is to ignore the
>> pitfalls and forge ahead come what may.
>> Bash assumes that the person typing commands has the full power to
> execute commands. I'm not sure what you mean by "security holes",
> unless it's passing text through bash that came from people who aren't
> allowed to type commands.

Let's mention a few traps:
 * Classic shell programming is built on the concept of string lists. A
 list of three file names could be stored in a variable as follows:
 files="a.txt b.txt c.txt"
 or maybe:
 files=$*
 Trouble is, whitespace is not a safe separator because it is a valid
 character in filenames.
 The only safe way out is to use bash's arrays, which are a deviation
 of the classic foundation. That's why most (?) shell scripts just
 ignore the possibility of whitespace in filenames.
 * A common, classic pattern to pipeline data is something like this:
 find_files |
 while read filename; do
 ... do a thing or two with "$filename" ...
 done
 Unfortunately, the pattern suffers from several problems:
 1. A filename can legally contain a newline.
 2. A filename can legally begin and end with whitespace which is
 stripped by the "read" builtin.
 3. The "read" builtin treats the backslash as an escape character
 unless the "-r" option is specified. The backslash is a valid
 character in a filename.
 * The classic "test" builtin (or "[ ... ]") has ambigous syntax:
 if [ -e "$filename" -o -e "$filename.bak" ]; then
 ...
 fi
 results in a syntax error if "$filename" should be "=".
 * This fails gracefully:
 local x
 x=$(false) || exit
 This doesn't fail at all:
 local x=$(false) || exit
Marko


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /