摘要
前面〈淺談Ubuntu上常見的壓縮與封存命令〉提過7zip可以製作自解封存檔,然而這類自解檔較常見的形式反而可能是以 .run 或 .sh 為副檔名(或稱後綴)的自解檔。之前第一次使用到這類自解檔感覺有點新鮮,有異於7zip做出來的東西,後來發現是由makeself做出來的。makeself可用在製作自解安裝檔的用途上,本文做點簡單介紹。
makeself簡介
makself 是開放源碼軟體專案,官網的介紹文字大致就很清楚,這裡只做簡要介紹。makeself.sh腳本用來把某目錄打包生成可自解壓縮的tar封存檔。所產生的檔案看來就像普通的shell腳本,也可執行,以 .run 或 .sh 為後綴名。所產生的壓縮tar封存檔的開頭是段小腳本,它用來解開檔案,執行內嵌的命令,並在完成時移除暫存檔。可以指定在解開檔案後自動執行某個命令或腳本。
幾點值得留意:
- makeself為保留與各式類Unix系統的相容性,以 sh (Bourne shell) 寫腳本代碼。在撰寫自動執行的命令或腳本時,可以用sh以外的shell,但要記得,必須採用目的電腦會有的shell,否則就白做了。
- makeself預設採用gzip壓縮,因為類Unix系統都有。可指定壓縮選項改用壓縮比較大的xz或bzip2,但目的電腦必須要有相同的壓縮程式,否則無法解開檔案。
- 同樣的,它提供的其他像加密功能,也大多類似上述採用系統中的其他命令來達成,故目的電腦中必須要有所要的命令,才能正確執行這些功能。
安裝makeself
Ubuntu可用apt安裝:
$ sudo apt install makeself
不過這裡為方便解說,自行到官網下載最新的版本,目前版號是2.4.0版。makeself-2.4.0.run 本身其實也是以makeself打包的,自行找個適當的位置下載存放好後,將其調整為可執行,先看一下幫助說明:
$ wget https://github.com/megastep/makeself/releases/download/release-2.4.0/makeself-2.4.0.run
$ chmod +x makeself-2.4.0.run
$ ./makeself-2.4.0.run -h
顯示用法如下:
Makeself version 2.4.0
1) Getting help or info about ./makeself-2.4.0.run :
./makeself-2.4.0.run --help Print this message
./makeself-2.4.0.run --info Print embedded info : title, default target directory, embedded script ...
./makeself-2.4.0.run --lsm Print embedded lsm entry (or no LSM)
./makeself-2.4.0.run --list Print the list of files in the archive
./makeself-2.4.0.run --check Checks integrity of the archive
2) Running ./makeself-2.4.0.run :
./makeself-2.4.0.run [options] [--] [additional arguments to embedded script]
with following options (in that order)
--confirm Ask before running embedded script
--quiet Do not print anything except error messages
--accept Accept the license
--noexec Do not run embedded script
--keep Do not erase target directory after running
the embedded script
--noprogress Do not show the progress during the decompression
--nox11 Do not spawn an xterm
--nochown Do not give the extracted files to the current user
--nodiskspace Do not check for available disk space
--target dir Extract directly to a target directory (absolute or relative)
This directory may undergo recursive chown (see --nochown).
--tar arg1 [arg2 ...] Access the contents of the archive through the tar command
-- Following arguments will be passed to the embedded script
以上即以makeself製作的自解檔可用的執行選項。現在,執行它,它會自動建立一個預設名稱為 makeself-2.4.0 的子目錄,並抽取出所有檔案放在其中。這裡為了方便使用makeself,把其中的二支 .sh 檔也複製到 /usr/bin 中:
$ ./makeself-2.4.0.run
$ cd makeslef-2.4.0
$ sudo cp *.sh /usr/bin/
如果不想用預設的子目錄名稱,可用 --target 選項,指定想要的名稱即可,同樣的,該目錄會自動建立。由於主要的 .sh 檔已在 /usr/bin/ 中,上述解開的目錄即可自行移除。如果不想放 /usr/bin/ 中,而是放其他非系統路徑中,如家目錄下,執行makeselft.sh時,請自行加上正確的路徑。
makeself使用法
這裡看一下 makeself.sh 的使用法,另一支 makeself-header.sh 則由前者呼叫使用,我們不會直接用到它。
$ makeself.sh -h
顯示的用法:
Usage: /usr/bin/makeself.sh [params] archive_dir file_name label startup_script [args]
params can be one or more of the following :
--version | -v : Print out Makeself version number and exit
--help | -h : Print out this help message
--tar-quietly : Suppress verbose output from the tar command
--quiet | -q : Do not print any messages other than errors.
--gzip : Compress using gzip (default if detected)
--pigz : Compress with pigz
--bzip2 : Compress using bzip2 instead of gzip
--pbzip2 : Compress using pbzip2 instead of gzip
--xz : Compress using xz instead of gzip
--lzo : Compress using lzop instead of gzip
--lz4 : Compress using lz4 instead of gzip
--compress : Compress using the UNIX 'compress' command
--complevel lvl : Compression level for gzip pigz xz lzo lz4 bzip2 and pbzip2 (default 9)
--base64 : Instead of compressing, encode the data using base64
--gpg-encrypt : Instead of compressing, encrypt the data using GPG
--gpg-asymmetric-encrypt-sign
: Instead of compressing, asymmetrically encrypt and sign the data using GPG
--gpg-extra opt : Append more options to the gpg command line
--ssl-encrypt : Instead of compressing, encrypt the data using OpenSSL
--ssl-passwd pass : Use the given password to encrypt the data using OpenSSL
--ssl-pass-src src : Use the given src as the source of password to encrypt the data
using OpenSSL. See "PASS PHRASE ARGUMENTS" in man openssl.
--ssl-no-md : Do not use "-md" option not supported by older OpenSSL.
--nocomp : Do not compress the data
--notemp : The archive will create archive_dir in the
current directory and uncompress in ./archive_dir
--needroot : Check that the root user is extracting the archive before proceeding
--copy : Upon extraction, the archive will first copy itself to
a temporary directory
--append : Append more files to an existing Makeself archive
The label and startup scripts will then be ignored
--target dir : Extract directly to a target directory
directory path can be either absolute or relative
--nooverwrite : Do not extract the archive if the specified target directory exists
--current : Files will be extracted to the current directory
Both --current and --target imply --notemp
--tar-extra opt : Append more options to the tar command line
--untar-extra opt : Append more options to the during the extraction of the tar archive
--nomd5 : Don't calculate an MD5 for archive
--nocrc : Don't calculate a CRC for archive
--sha256 : Compute a SHA256 checksum for the archive
--header file : Specify location of the header script
--follow : Follow the symlinks in the archive
--noprogress : Do not show the progress during the decompression
--nox11 : Disable automatic spawn of a xterm
--nowait : Do not wait for user input after executing embedded
program from an xterm
--lsm file : LSM file describing the package
--license file : Append a license file
--help-header file : Add a header to the archive's --help output
--packaging-date date
: Use provided string as the packaging date
instead of the current date.
--keep-umask : Keep the umask set to shell default, rather than overriding when executing self-extracting archive.
--export-conf : Export configuration variables to startup_script
Do not forget to give a fully qualified startup script name
(i.e. with a ./ prefix if inside the archive).
可以看到其指令形式:
makeself.sh [params] archive_dir file_name label startup_script [args]
- [params]:命令選項,後述。
- archive_dir:就是要打包的目錄。
- file_name:即自解檔名稱。
- label:對此自解檔的描述文字。
- starup_script:解開後要執行的腳本命令。如果是所解開目錄中的命令,記得該命令要前置 ./ 。
- [args]則是要給startup_script的參數。
- --version | -v:顯示版號。
- --help | -h:顯示上述的用法。
- --notemp:不使用暫存目錄。
- --needroot:檢查執行者是否為root。
- --target dir:解壓縮標的目錄。可為絕對或相對路徑。
使用範例
原本嘗試做了個範例,以小小輸入法臺灣包2018年版的Linux包裝檔為例,改用makeself來製作自解安裝檔,讓makeselft解開檔案後自動執行內容有sudo ./yong-tool.sh --install
的shell腳本,雖然執行上沒有錯誤訊息,但實際上不成功,所以這裡改成以yong-tool.sh顯示系統資訊。先解開原包裝檔,用makeself把整個 yong 目錄打包,並指定解開後自動執行其中的yong-tool.sh,並給它--sysinfo選項以顯示系統資訊:
$ makeself.sh --notemp yong yong-tw2018.run "yong IME TW 2018" ./yong-tool.sh --sysinfo
沒問題的話,可以把新產生的 yong-tw2018.run 弄到目標電腦上,並在該電腦中執行它。假定在放檔案的位置啟動終端機用命令列,以解開到 /opt/yong 為例:
$ chmod +x yong-tw2018.run
$ sudo ./yong-tw2018.run --target /opt/yong
上面因要存到/opt/下才加 sudo,檔案會解開到/opt/yong下。如果不加 --target 則會在目前目錄中建立 yong 子目錄,解開檔案在其中。如果只想放在自家目錄,假定有個app子目錄放各種自用軟體,可以這樣:
$ ./yong-tw2018.run --target ~/app/yong
解開之後還要進行後續的安裝工作,可參考小小輸入法臺灣包2018年版的Linux安裝說明。參考
- https://www.armedia.com/blog/create-a-self-extracting-installer-in-linux/
沒有留言:
張貼留言