Порядок, в котором связаны библиотеки, имеет значение, если библиотеки зависят друг от друга. В общем случае, если библиотека A
зависит от библиотеки B
, тогда libA
ДОЛЖЕН появляться перед libB
в флагах компоновщика.
Например:
// B.h
#ifndef B_H
#define B_H
struct B {
B(int);
int x;
};
#endif
// B.cpp
#include "B.h"
B::B(int xx) : x(xx) {}
// A.h
#include "B.h"
struct A {
A(int x);
B b;
};
// A.cpp
#include "A.h"
A::A(int x) : b(x) {}
// main.cpp
#include "A.h"
int main() {
A a(5);
return 0;
};
Создайте библиотеки:
$ g++ -c A.cpp
$ g++ -c B.cpp
$ ar rvs libA.a A.o
ar: creating libA.a
a - A.o
$ ar rvs libB.a B.o
ar: creating libB.a
a - B.o
Скомпилируйте:
$ g++ main.cpp -L. -lB -lA
./libA.a(A.o): In function `A::A(int)':
A.cpp:(.text+0x1c): undefined reference to `B::B(int)'
collect2: error: ld returned 1 exit status
$ g++ main.cpp -L. -lA -lB
$ ./a.out
Чтобы повторить снова, порядок имеет значение!
Вот инструмент, который я создал для минимизации bash-скриптов: https://github.com/precious/bash_minifier - он пытается удалить все комментарии и как можно больше пробелов / вкладок / новых строк , Он также доступен в качестве сервиса здесь https://bash-minifier.appspot.com/ .
Чтобы минимизировать ваш скрипт bash, выполните следующую команду:
python minifier.py /path/to/shell/script.sh
: P здесь что-то смешное.
говорят, что ваш сценарий имеет имя origin
, а запутанный - с именем obsf
.
здесь origin
:
#!/bin/sh
echo "fooo"
здесь obsf
$ echo "echo $(base64 origin)" > obsf
$ cat obsf
echo IyEvYmluL3NoCmVjaG8gImZvb28iCg==
$ chmod +x obsf
теперь rm origin
и запустите obsf
следующим образом:
$ sh obsf | base64 -d | sh
fooo
heh: 3
Инструмент для обфускации сценариев оболочки: http://www.comp.eonworks.com/scripts/obfuscate_shell_script-20011012.html
Отчасти глупый, но это зависит от вас. Существуют также способы «скомпилировать» ваш сценарий оболочки в исполняемый файл. Этот принятый ответ сообщения дает несколько ссылок с инструментами для этого.
Хотя это старый вопрос, он, похоже, популярен в Google. Я также искал bash minifer / obfuscator и не любил ответ в ответ.
Я не хотел добавлять тарабарщину или компилировать скрипт. Поэтому я написал один, который сделал то, что я хотел в Perl, и поместил его в GitHub в https://github.com/Aralhach/bashobfus/tree/master Он может:
Там может быть какой-то случай, когда он терпит неудачу, но я тестировал его с довольно большим сценарием bash, и появлялись случаи замены переменных. Он также оставляет переменные только в одиночных кавычках (') - это всплыло при печати AWK-скрипта , но заменяет одиночные кавычки ('), когда оператор уже находится внутри двойных кавычек («) - - это появилось при печати инструкции MySQL .
Это заставляет меня думать, что я рассмотрел все варианты большого использования, но раньше я ошибался. баги, не стесняйтесь сообщать о них (или исправить их!: D). Я также думал о добавлении функции для объединения коротких строк в один с «;», но случаев было слишком много, чтобы анализировать, делая мой крайний срок.
Я надеюсь, что люди сочтут это полезным!
Исходный файл script.sh
:
#!/usr/bin/env bash
echo "foo"
Создать other.sh
$ echo '#!/usr/bin/env bash' > other.sh
$ echo "echo '$(base64 script.sh)' | base64 -d | sh" >> other.sh
$ chmod +x other.sh
Результат (cat other.sh
):
#!/usr/bin/env bash
echo 'IyEvdXNyL2Jpbi9lbnYgYmFzaAplY2hvICJmb28iCg==' | base64 -d | sh
Попробуйте:
$ ./other.sh
foo
Минимизация и обфускация скрипта оболочки - это две разные вещи.
Минимизация означает уменьшение размера скрипта путем удаления всех ненужных символов из исходного кода без изменения его функциональности.
Minification:
Чтобы минимизировать большой скрипт, вы можете запустить следующий код против фактического скрипта. вы хотите минимизировать:
#!/bin/sh
Script=${1}
if [ ! -z "${Script}" ] && [ -f ${Script} ] ; then
CurrenTime=$(date | sed -e 's~ ~_~g' -e 's~:~~g')
cp ${Script} ${Script}_${CurrenTime}
#### Remove all empty lines
#### Remove lines that begin with spaces and a comment sign #
#### Remove all comment lines (meaning, lines that begin with a "#")
awk '
(/.*/ || /#!/) && (!/^#$/) &&
(!/^#[[:blank:]]/) && (!/^#[a-z]/) &&
(!/^#[A-Z]/) && (!/^##/) &&
(!/^\t#/) && (!/^[[:space:]]*$/) &&
( /^#.*!/ || !/^[[:space:]]*#/)
' ${Script} | sed 's_^[[:space:]]*__g' > ${Script}.tmp 2>/dev/null
#' ${Script} > ${Script}.tmp 2>/dev/null (comment out the above line and uncomment this line if your HEREDOCS are affected)
ExitCode=$?
if [ ${ExitCode} -eq 0 ] && [ -s ${Script}.tmp ] ; then
echo
echo "SUCCESS: Your newly [ minified ] script can be found here [ ${Script}.tmp ]."
echo "Review the script [ ${Script}.tmp ] and if happy with it, replace your original script with it!"
echo "NOTE: Your original script [ ${Script} ] was backed up as [ ${Script}_${CurrenTime} ]!"
echo
exit 0
else
echo
echo "FAILURE: Unable to [ minify ] the specified script [ ${Script} ]!!!"
echo
exit 2
fi
else
echo
echo "USAGE: ${0} <your-script>"
echo
exit 3
fi
Примечание. Минализация имеет тенденцию иметь значение, только если миниатюрный скрипт является большим ... с несколькими сотнями или даже тысячами строк.
Obfuscation:
После завершения вышеописанной миниатюры вы можете просто остановиться там, если уменьшить размер что вы собираетесь делать. Если, однако, после минимизации, вы также хотите обфускать свой сценарий, у вас есть варианты.
Самый простой способ обфускации вашего скрипта - использование инструментов шифрования, таких как Openssl.
To encrypt your script using Openssl:
1. cat <your-script> | openssl aes-128-cbc -a -salt -k "specify-a-password" > yourscript.enc
OR
2. openssl aes-128-cbc -a-salt -in <path-to-your-script> -k "yourpassword"
To decrypt a script using Openssl (notice the '-d'):
1. cat yourscript.enc | openssl aes-128-cbc -a -d -salt -k "specify-a-password" > yourscript.dec
OR
2. openssl aes-128-cbc -a -d -salt -in <path-to-your-script> -k "yourpassword" > yourscript.dec
Шифрование / Обфускация:
Основываясь на идее c00kiemon5ter, здесь у вас есть сценарий
. Ваши витые рекурсивные умы будут любить его, поскольку это не оригинальный сценарий, а запутанный (обфусканный (оригинал))
#!/bin/bash
#
# Usage:
# obfuscate scrript.sh > script_obfuscated.sh
#
PIXIE=$(mktemp)
base64 -d >${PIXIE}<<DIXIE
IyEvYmluL2Jhc2ggClBJWElFPSQobWt0ZW1wKQpiYXNlNjQgLWQgID4ke1BJWElFfTw8RElYSUUK
SXlFdlltbHVMMkpoYzJnS2FXWWdXeUFnTFdZZ0lpUXhJaUJkSUFwMGFHVnVDbU5oZENBOFBGQkpX
RWxGSUFvaklTOWlhVzR2WW1GegphQ0FLVUVsWVNVVTlYQ1FvYld0MFpXMXdLUXBpWVhObE5qUWdM
V1FnSUQ1Y0pIdFFTVmhKUlgwOFBFUkpXRWxGQ2lRb1ltRnpaVFkwCklDUXhLUXBFU1ZoSlJRcHpi
M1Z5WTJVZ1hDUjdVRWxZU1VWOUNuSnRJQzF5WmlCY0pIdFFTVmhKUlgwS1VFbFlTVVVLWlhocGRD
QXcKQ21acENtTmhkRHc4VGtWU1JBb2dJQ0IxYzJGblpUb2diMkoxYzJOaGRHVWdjMk55YVhCMENn
b2dJQ0JYYVd4c0lHZGxibVZ5WVhSbApJQ0p6WTNKcGNIUXViMkp6YUNJS1RrVlNSQW89CkRJWElF
CnNvdXJjZSAke1BJWElFfQpybSAtcmYgJHtQSVhJRX0K
DIXIE
source ${PIXIE}
rm -rf ${PIXIE}