With zwer's answer I tried the following
first from bash (this is the same binary literal given by ybakos)
export FOO='\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
then I launched the python shell (I have python 3.5.2)
>>> import os
>>> # ybakos's original binary literal
>>> foo = b'\x1b\xba\x94(\xae\xd0\xb2\xa6\xf2f\xf6\x1fI\xed\xbao$\xc6D\x08\xba\x81\x96v'
>>> # ewer's python 3.x solution
>>> FOO = bytes(os.environ["FOO"], "utf-8").decode('unicode_escape')
>>> foo == FOO
False
>>> ^D
The last line of foo == FOO should return true, so the solution does not appear to work correctly.
I noticed that there is an os.envirnb dictionary, but I couldn't figure out to set an Environment Variable to a binary literal, so I tried the following alternative which uses base64 encoding to get an ASCII version of the binary literal.
First launch python shell
>>> import os
>>> import base64
>>> foo = os.urandom(24)
>>> foo
b'{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e<\xd7\xba\xf1\xb4\x99\xf056\x90U\x16\xae'
>>> foo_base64 = base64.b64encode(foo)
>>> foo_base64
b'e9lxkIu67Hazyx4817rxtJnwNTaQVRau'
>>> ^D
Then in the bash shell
export FOO_BASE64='e9lxkIu67Hazyx4817rxtJnwNTaQVRau'
Then back in the python shell
>>> import os
>>> import base64
>>> # the original binary value from the first python shell session
>>> foo = b'{\xd9q\x90\x8b\xba\xecv\xb3\xcb\x1e<\xd7\xba\xf1\xb4\x99\xf056\x90U\x16\xae'
>>> dec_foo = base64.b64decode(bytes(os.environ.get('FOO_BASE64'), "utf-8"))
>>> # the values match!
>>> foo == dec_foo
True
>>> ^D
The last line shows that the 2 results are the same!!
What we are doing, is first getting a binary value from os.urandom() and Base64 encoding it. We then use the Base64 encoded value to set the environment variable. Note: base64.b64encode() returns a binary value, but it will only contain printable ASCII characters.
Then in our program we read in the Base64 encode string value from the environment variable, convert the string into it's binary form, and finally Base64 decode it back to its original value.
foo
in Python where it came from something likeos.urandom
and seeb'\x1b\xba...'
then it is (in Python) raw bytes. If you read it from the envvar and see'\\x1b\\xba'
then it's a (Unicode) string that's still escaped. As per this question, it seems like bash won't interpret yourexport FOO
line as real binary, but a string with a bunch of\x
's in it. – Domenech