I find myself writing little functions to to paste in to terminals to provide stream handlers quite often, like:
1
2
3
4
5
6
| base64_decode() {
php -r 'echo base64_decode(stream_get_contents(STDIN));'
}
base64_encode() {
php -r 'echo base64_encode(stream_get_contents(STDIN));'
}
|
Which can be used to encode or decode base64 strings in a stream, e.g.:
1
2
3
4
| $ echo foo | base64_encode
Zm9vCg==
$ echo Zm9vCg== | base64_decode
foo
|
which is fun, but I wanted to make it a little more portable, so lets try a few more languages…
1
2
3
4
5
6
7
8
9
10
11
12
| # ruby
base64_encode() { ruby -e 'require 'base64'; puts Base64.encode64(ARGF.read)'; }
base64_decode() { ruby -e 'require 'base64'; puts Base64.decode64(ARGF.read)'; }
# python
base64_encode() { python -c 'import base64, sys; sys.stdout.write(base64.b64encode(sys.stdin.read()))'; }
base64_decode() { python -c 'import base64, sys; sys.stdout.write(base64.b64decode(sys.stdin.read()))'; }
# perl
base64_encode() { perl -e 'use MIME::Base64; print encode_base64(<STDIN>);'; }
base64_decode() { perl -e 'use MIME::Base64; print decode_base64(<STDIN>);'; }
# openssl
base64_encode() { openssl enc -base64; }
base64_decode() { openssl enc -d -base64; }
|
and now to wrap them all under something that picks whichever seems to be available:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| base64_php() { php -r 'echo base64_$1(stream_get_contents(STDIN));'; }
base64_ruby() { ruby -e 'require 'base64'; puts Base64.${1}64(ARGF.read)'; }
base64_perl() { perl -e 'use MIME::Base64; print $1_base64(<STDIN>);'; }
base64_python() { python -c 'import base64, sys; sys.stdout.write(base64.b64$1(sys.stdin.read()))'; }
base64_openssl() { openssl enc $([[ $1 == encode ]] || echo -d) -base64; }
base64_choose() {
for lang in openssl perl python ruby php; do
if [[ $(type -t '$lang') == 'file' ]]; then
'base64_$lang' '$1'
return
fi
done
echo 'ERROR: No suitable language found'
return 1
}
base64_encode() { base64_choose encode; }
base64_decode() { base64_choose decode; }
|
great, now I can quickly grab some base64 commands on any box I’m likely to be working on in the foreseeable future.