Never Ending Security

It starts all here

How To Encrypt Bash Scripts

How to Encrypt Bash Script

if you want to encrypt your bash script for some reason, you can do that with SHC utility. Encrypting your script with SHC provides you with a basic type of protection. Please note that the encrypted shell script created by shc is not readable by a regular users but a skilled user can extract the original shell script from the encrypted binary. General rule is to avoid shell script encryption and use better solutions for your problem.

SHC stands for shell script compiler.


Download shc and install it as shown below.

# wget
# tar xvfz shc-3.8.9.tgz
# cd shc-3.8.9
# make

Verify that shc is installed properly.

$ ./shc -v
shc parse(-f): No source file specified

shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script

Create a Sample Shell Script

Create a sample bash shell script that you like to encrypt using shc for testing purpose.

$ vi

echo -n "How many random numbers do you want to generate? "
read max

for (( start = 1; start <= $max; start++ ))
  echo -e $RANDOM

$ ./
How many random numbers do you want to generate? 3

Encrypt the Shell Script Using shc

Encrypt the shell scripting using shc as shown below.

$ ./shc -f

This will create the following two files:

$ ls -l*
-rwxrw-r--. 1 ramesh ramesh   149 Mar 27 01:09
-rwx-wx--x. 1 ramesh ramesh 11752 Mar 27 01:12
-rw-rw-r--. 1 ramesh ramesh 10174 Mar 27 01:12
  • is the original unencrypted shell script
  • is the encrypted shell script in binary format
  • is the C source code of the file. This C source code is compiled to create the above encrypted file. The whole logic behind the shc is to convert the shell script to C program (and of course compile that to generate the executable)
$ file Bourne-Again shell script text executable

$ file ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux, stripped

$ file ASCII C program text

Execute the Encrypted Shell Script

Now, let us execute the encrypted shell script to make sure it works as expected.

$ ./
How many random numbers do you want to generate? 3

Please note that the binary itself is still dependent on the shell (the first line provided in the i.e /bin/bash) to be available to execute the script.

Specifying Expiration Date

Using shc you can also specify an expiration date. i.e After this expiration date when somebody tries to execute the shell script, they’ll get an error message.

$ ./shc -e 31/12/2014 -f

In this example, if someone tries to execute the, after 31-Dec-2014, they’ll get a default expiration message as shown below.

$ ./
./ has expired!
Please contact your provider

If you like to specify your own custom expiration message, use -m option (along with -e option as shown below).

$ ./shc -e 31/12/2014 -m "Contact for new version of this script" -f

$ ./
./ has expired!
Contact for new version of this script

Create Redistributable Encrypted Shell Scripts

Apart from -e, and -m (for expiration), you can also use the following options:

  • -r will relax security to create a redistributable binary that executes on other systems that runs the same operating system as the one on which it was compiled.
  • -T will allow the created binary files to be traceable using programs like strace, ltrace, etc.
  • -v is for verbose

Typically you might want to use both -r and -T option to create a re-distributable and traceable shell encrypted shell script as shown below.

$ ./shc -v -r -T -f
shc shll=bash
shc [-i]=-c
shc [-x]=exec '%s' "$@"
shc [-l]=
shc opts=
shc: cc -o
shc: strip
shc: chmod go-r

$ ./
How many random numbers do you want to generate? 3

Leave a Reply

Please log in using one of these methods to post your comment: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s