Create self-extracting archive on Linux
A self-extracting archive (SFX) is convenient when you need to copy files to another computer which may not already have the archive software installed. For example, many Windows drivers are installed using SFX.
On Windows, we can create a SFX using a GUI archive software such as 7-Zip and WinRAR. Simply right click the selected files and choose Add to archive…, then tick Create SFX archive. If you want to encrypt the files, you can set a password. If you also want to encrypt the file names, tick Encrypt file names. In this way, a SFX with password protection on both data and header is created.
Create SFX (as Linux binary) on Linux
But how can we create a SFX on Linux using command line?
This turns out to be possible with the 7z
program (from package p7zip
) using
option -sfx
. For example, to create a SFX data.exe
for dir data
:
7z a -sfx data.exe data
You can also encrypt both data and header in a SFX with option
-mhe=on
. For example, to create a SFX data.exe
with password
123456
for dir data
:
7z a -mhe=on -p123456 -sfx data.exe data
If you don’t want to write the password in plaintext, you can use -p
alone and
it will prompt you for the password:
7z a -mhe=on -p -sfx data.exe data
Create SFX (as Windows binary) on Linux
But you may have noticed that, the created SFX is a Linux binary, not a Windows binary:
# file data.exe
data.exe: ELF 64-bit LSB executable, x86-64,...
So it won’t work on Windows systems. To understand this, note that a SFX is
combined from a executable part (stub) and a non-executable part (archive). To
visualize this, we give a simple example of creating SFX with the ZIP format
using cat
:
cat "$(which unzipsfx)" foo.zip > foo.exe
Here the stub unzipsfx
comes from package unzip
, which you can find on most
Linux distros. As you can see, creating SFX can be as simple as cat
a stub
and a archive.
Now it should be easier to understand why data.exe
is a Linux binary: Because
it’s generated with a Linux stub. If you are copying files to a Windows machine,
you have to generate SFX using a Windows stub. This is still possible with the
-sfx
option. Actually, the -sfx
option allows you to specify the SFX module
in the generated archive using format -sfx[{SFX_Module}]
. Now we need to find
a proper Windows SFX module.
The Windows SFX module exists in the 7-Zip installation program:
-
For 32-bit Windows system: https://www.7-zip.org/a/7z1805.exe
-
For 64-bit Windows system: https://www.7-zip.org/a/7z1805-x64.exe
Taking the 64-bit program for example. This program is actually a SFX itself. So we can extract files from it even if we are on Linux:
7z x 7z1805-x64.exe
There is a file named 7z.sfx
in the extracted files. This is what we use as
the SFX module in the command line option. Copy this file to the dir where the
command will be run, and run the command:
7z a -mhe=on -p -sfx7z.sfx data.exe data
The generated SFX should work on a Windows system.