shell脚本转换成二进制的可执行文件方法--加密

2023-05-16

http://www.360doc.com/content/14/0507/14/10058718_375504586.shtml

http://www.linuxidc.com/Linux/2014-12/110612.htm
http://www.jb51.net/article/58853.htm

第一种方法(gzexe):
这种加密方式不是非常保险的方法,但是能够满足一般的加密用途,可以隐蔽脚本中的密码等信息。
它是使用系统自带的gzexe程序,它不但加密,同时压缩文件。
使用方法:
gzexe file.sh
它会把原来没有加密的文件备份为 file.sh~ ,同时 file.sh 即被变成加密文件;

第二种方法(shc):
使用 shc 对 Linux shell 脚本加密.
shc是一个专业的加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件,这个办法很好的解决了脚本中含有IP、密码等不希望公开的问题.
shc的下载地址:              
http://download.chinaunix.net/download/0010000/9479.shtml
安装:
tar zxvf shc-3.8.tgz
cd shc-3.8
make test
make
make test
make strings
make install
使用方法:
shc -r -f script-name
运 行后会生成两个文件,script-name.x 和 script-name.x.c.   其中script-name.x是加密后的可执行的二进制文件;用./script-name即可运行,script-name.x.c是生成 script-name.x的原文件(c语言).

 

-----------------------------------------------------------------------

 

如果你的shell脚本包含了敏感的口令或者其它重要信息, 而且你不希望用户通过ps -ef(查看系统每个进程的状态)捕获敏感信息. 你可以使用shc工具来给shell脚本增加一层额外的安全保护. shc是一个脚本编译工具, 使用RC4加密算法, 它能够把shell程序转换成二进制可执行文件(支持静态链接和动态链接). 该工具能够很好的支持: 需要加密, 解密, 或者通过命令参数传递口令的环境.

shc主页: 
http://www.datsi.fi.upm.es/%7Efrosal/

现在的版本是3.8.6(shc-3.8.6.tgz), 以此为例介绍shc的安装及应用:

准备:
首先你需要检查系统是否安装了gcc编译器, 以Fedora Core 6为例介绍gcc的检查和安装: 
# rpm -qa|grep compat-gcc 
compat-gcc-34-3.4.6-4 
如果没有安装, 按下面步骤安装gcc 
# wget ftp://mirrors.kernel.org/fedora/core/6/i386/os/Fedora/RPMS/compat-gcc-34-3.4.6-4.i386.rpm 
然后 
# ln -s /usr/bin/gcc34 /usr/bin/cc

安装:
# wget http://www.datsi.fi.upm.es/%7Efrosal/sources/shc-3.8.6.tgz 
# tar vxf shc-3.8.6.tgz 
# cd shc-3.8.6 
# make test 
# make strings 
# make install

应用:
下面以mysql数据库备份(备份文件通过ftp上传到一台远程的服务器)脚本为例: 
############################### mysql_backup.sh ############################## 
#!/bin/sh

newtime=`date +%m-%d-%y_%I%M%p` 
mysqldump -u ****** -p ****** dbname | gzip > /Users/****/Documents/dbName_$newtime.sql.gz 
echo “backup of dbname” 
curl –upload-file dbname$newtime.sql.gz –url “ftp://*****:*****@host/” 
echo “ftp of dbname done”

############################### mysql_backup.sh ##############################

1). 加密脚本.

# shc -v -f mysql_backup.sh 
-v: 是verbose模式,输出更详细编译日志. -f: 指定脚本的名称.

上面命令在屏幕上的输出: 
shc shll=sh 
shc [-i]=-c 
shc [-x]=exec ‘%s’ “$@” 
shc [-l]= 
shc opts= 
shc: cc mysql_backup.sh.x.c -o mysql_backup.sh.x 
shc: strip mysql_backup.sh.x 
shc: chmod go-r mysql_backup.sh.x

我们可以看到生成了动态链接可执行二进制文件mysql_back.sh.x和C源文件mysql_backup.sh.x.c, 注意生成的二进制文件因为是动态链接形式, 所以在其它平台上不能运行:

mysql_backup.sh.x: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

2). 生成静态链接的二进制可执行文件.

不过, 我们可以通过下面的方法生成一个静态链接的二进制可执行文件:

# CFLAGS=-static shc -r -f mysql_backup.sh 
# file mysql_backup.sh.x 
mysql_backup.sh.x: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), 
statically linked, for GNU/Linux 2.6.9, stripped

提示: 通过sch加密后的脚本文件很安全吗? 
一般来说是安全的, 不过可以使用gdb和其它的调试工具获得最初的源代码. 如果你需要更加安全的方法, 可以考虑使用wzshSDK.

另外, sch还可以设置脚本的运行期限和自定义返回信息: 
shc -e 03/31/2007 -m “the mysql backup script is now out of date.” -f mysql_back.sh

-e表示脚本将在2007年3月31日前失效, 并根据-m定义的信息返回给终端用户.

3). 二进制文件的剖析
有兴趣的朋友可以参阅下面的文章: 
Paranoid Penguin - Limitations of shc, a Shell Encryption Utility

你好 shc 能不能在64位的机子上运行我有台64位的服务器 OS 为64位的rhel4up2 执行加密后的脚本出错 
test.sh.x: has expired! 
Please contact your provider 
是什么问题 估计在运行命令的时候-e选项指定的日期已经失效, 注意看一下服务器的时间是否正确.

在64(OS为64位)位的机子加-e 和不加 -e 还是报那样的错误,服务器的时间没有问题,我在32位的机子上测试完全正常,你可以在64位测试以下

 

 

 

下面就说明一下shc的安装,参数,以及使用示例:
下载安装:
(官网下载地址: http://www.datsi.fi.upm.es/~frosal/sources/)
# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.7.tgz
# cd shc-3.8.7
# make
# make install
(仅用make就可以完成安装,运行shc时要指出绝对路径;用make install,将shc安装到/usr/local/bin下,可以直接运行)

常用参数:
-e date 
Expiration date in dd/mm/yyyy format [none](指定过期日期)

-m message
message to display upon expiration ["Please contact your provider"](指定过期提示的信息)

-f script_name
File name of the script to compile(指定要编译的shell的路径及文件名)

-r Relax security. 
Make a redistributable binary which executes on different systems running the same operat-ing system.(可以相同操作系统的不同系统中执行)

-v Verbose compilation(编译的详细情况)

使用示例:
[root@centos54 tmp]# /usr/local/src/shc-3.8.7/shc -e 20/10/2010 -m "contact xxx@163.com" -v -r -f ./ex.sh
-e:指定过期时间为2010年10月20日
-m:过期后打印出的信息;
-v: verbose
-r: 可在相同操作系统的不同主机上执行
-f: 指定源shell

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell脚本转换成二进制的可执行文件方法--加密 的相关文章

  • bash.sh 运行 cron 的权限被拒绝

    如何在这里使用 bash 脚本运行 cron 我做了如下操作 这里有错误 我想知道如何在 ubuntu 中做到这一点 我现在对它感到震惊 bash sh 文件 bin bash cd var www Controller usr bin p
  • 从配置文件中读取分配

    我有配置文件 其中每行都包含用分号分隔的分配 像这样的东西 模仿正常的 shell 分配 VAR1 1 VAR2 2 VAR1 3 VAR2 4 每行包含相同的变量 并且旨在单独处理 这些配置文件都在系统管理员的控制之下 所以使用eval现
  • 基于文件位置而不是当前工作目录的相对路径[重复]

    这个问题在这里已经有答案了 Given some txt dir cat sh cat sh 的内容如下 cat some txt 然后运行 cat sh inside dir运行时工作正常 dir cat sh与dir才不是 我预计这是由
  • bash 脚本中的变量值不会改变[重复]

    这个问题在这里已经有答案了 运行以下代码 a one echo a a two echo a a three echo a gt a 结果是 one one 以及创建的文件名称为 one 内容为 one 为什么变量没有更改为two在第 2
  • 从 GNU Makefile 调用 `command -v find`

    我使用 shell bash 但我需要可移植性 和 GNU Makefile 我有这个代码 check commands command v find gt dev null command v asdf gt dev null 正如假设的
  • 如何在 Emacs shell 缓冲区中获得对“✖”等的支持?

    我正在运行一个进程 如果出现错误 则输出字符 如 Unicode 中定义 但是 如果在 Emacs shell 缓冲区 GNU Emacs 的 Aquamacs 发行版 中运行该进程 我根本看不到错误 使用 braeburn aquamac
  • “设置:非法选项 -”在一台主机上,但在另一台主机上则不然

    我在我的一台 ubuntu 虚拟机中编写了一个 sh 脚本 该脚本工作正常 但是当我尝试在其他虚拟机中运行它时 它不起作用 两个虚拟机应该相同 和bash version两个虚拟机均回复 GNU bash version 4 3 11 1
  • shell 脚本中的 Telnet

    如何在 shell 脚本中运行 telnet 并在远程服务器上执行命令 出于安全原因 我没有在我的Solaris 机器上安装expect 我也没有perlnet telnet模块已安装 那么如果不使用expect和perl我该怎么办呢 我尝
  • 使用 find 和 xargs 交互删除文件

    我正在尝试将一些文件从 find 命令传输到交互式删除命令 以便我可以仔细检查要删除的文件 但我遇到了一些麻烦 find name print0 xargs 0 rm i 我认为上面的方法可行 但我只得到一串 rm remove regul
  • PHP 中是否有相当于 subprocess 的东西?

    在 Java 和 Python 中 你有ProcessBuilder or 子流程 https docs python org 2 library subprocess html可让您使用未转义字符串轻松启动进程的模块 例如 ls some
  • “bash -c 命令参数”末尾的参数的目的是什么?

    From man bash If the c option is present then commands are read from the first non option argument command string If the
  • 如果文件没有行尾字符,则 wc -l 不计算文件的最后一个

    我需要计算 unix 文件的所有行数 该文件有 3 行 但是wc l仅给出 2 个计数 我知道它不计算最后一行 因为它没有行尾字符 任何人都可以告诉我如何计算这一行吗 grep c返回匹配行的数量 只需使用一个空字符串 作为您的匹配表达式
  • Ansible - 当至少一项在循环中失败时跳过任务

    我正在使用 sqlplus 运行一些 SQL 脚本 在运行之前 我从该目录获取所有 sql 文件列表并将其存储在sql out如下所示 问题是 如果其中一个 sql 脚本失败 其余 sql 脚本仍然会执行 如果任何一个脚本失败 我想完全跳过
  • unix 下日期字段排序

    我有包含数十万条记录的文本文件 其中一个字段是日期字段 有没有办法根据日期字段对文件进行排序 09 APR 12 04 08 43 632279000 AM 19 MAR 12 03 53 38 189606000 PM 19 MAR 12
  • 在压缩存档内的文本文件上运行“head”,而不解压存档

    问候 我接手了之前的团队并编写了处理 csv 文件的 ETL 作业 我在 ubuntu 上结合使用 shell 脚本和 perl csv 文件很大 它们以压缩档案形式到达 解压后 很多都超过 30Gb 是的 那是 G 旧进程是在 cron
  • 将 JSON 导出到环境变量

    如果我有这样的 JSON hello1 world1 testk testv 我想将每个键值对导出为环境变量 如何通过 shell 脚本来做到这一点 例如 当我在终端上写时 echo hello1 world1应该打印其他键值对吗 注意 上
  • 如何使用 docker ENTRYPOINT 与 shell 脚本文件组合参数

    我编写 shell 脚本文件并将其与 docker ENTRYPOINT 一起使用 但是当我运行 docker image 时 由于入口点代码行 它只是停止而没有任何错误日志 我的 Dockerfile FROM ubuntu 16 04
  • Bash:递归复制命名文件,保留文件夹结构

    我希望 cp R src prog js images icon jpg tmp package 将在目标目录中产生对称结构 tmp package src prog js images icon jpg 但相反 这两个文件都被复制到 tm
  • 如何从 LaTeX 执行 shell 脚本?

    我正在尝试在 LaTeX 中执行以下操作 documentclass article begin document execute usr local bin my shell script sh end document 想法是执行 us
  • 在 VBA 中捕获 shell 命令的输出值?

    发现这个功能http www cpearson com excel ShellAndWait aspx http www cpearson com excel ShellAndWait aspx 但我还需要捕获 shell 的输出 有什么代

随机推荐