前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多语言混编脚本

多语言混编脚本

作者头像
drunkdream
发布2020-06-07 11:01:24
1.3K0
发布2020-06-07 11:01:24
举报
文章被收录于专栏:醉梦轩醉梦轩

0x00 前言

通常一个脚本都是使用某一种语言编写,使用固定的解释器执行。例如以下这段vbs脚本:

代码语言:javascript
复制
WScript.echo("Hello World!")

可以使用wscriptcscript执行,但肯定不能使用cmd或其他程序执行。

是否可以构造这样一种脚本,能同时被多种解释器执行呢?

0x01 小试牛刀

下面是一段神奇的脚本:

代码语言:javascript
复制
:On Error Resume Next

:Sub bat
'&cls&@echo off
cscript -nologo -e:vbs "%~f0"
:End Sub

:WScript.echo("Hello world!")

这段代码即可以当做bat来执行,也可以当做vbs来执行,主要是利用了以下几个特性:

  • :bat中可用作注释,而在vbs中可以用于连接多条语句
  • 'vbs中是注释符;&bat中是命令连接符
  • scsript命令可以将文件当做vbs脚本执行

从上面这个例子可以看出:

要实现一个多语言混编脚本,可以充分利用语言本身的特点,如:注释符、连接符等,特别是那些在多语言中都是合法的语法。

0x02 bat与shell混编

当命令行需要跨平台时,就需要进行batshell的混编。

代码语言:javascript
复制
: '
@echo off
goto bat
'

echo sh;
exit

:bat
echo batch

上面这段代码可以同时作为shell脚本和bat脚本执行,不过执行的代码是不同的。这里主要是利用了以下几点特性:

  • : '是bash中的多行注释,也可以作为bat中的注释
  • 利用bat的goto语句跳过bash代码区域

0x03 shell与python混编

这种方式可以将本来需要两个文件实现的功能压缩到一个文件中。

将下面的内容保存到文件py.sh:

代码语言:javascript
复制
#! /bin/sh

"""
" 2> /dev/null
echo "Run python $0"
exec python $0
"""

import sys
print(sys.version_info)
代码语言:javascript
复制
$ ./py.sh
Run python ./py.sh
sys.version_info(major=2, minor=7, micro=17, releaselevel='final', serial=0)

这里主要是利用了"""在python中可以用作多行注释的作用,将bash脚本包含在其中,最后通过exec跳转到python程序,避免了后面代码的执行。

" 2> /dev/null这行主要是为了闭合前面一行的最后一个",以及捕获产生的错误。

0x04 bat与python混编

代码语言:javascript
复制
rem = '''
@echo off
python %0
goto :exit
'''

import sys
print(sys.version_info)
exit(0)

''' 2> NUL
:exit
echo exit bat
:'''

bat与python的混编方法与上面的方法基本一致:

  • bat使用rem作为注释,python将rem与’’’形成赋值表达式,并且避免了由于bat命令导致的语法错误
  • bat使用goto语法跳过了python代码
  • :'''通过前面的:避免了'''执行报错

这段代码唯一有缺陷的就是第一行会导致以下无用输出:

代码语言:javascript
复制
C:\>rem = '''

尝试了很多办法都不能将其移除掉。

0x05 bat、shell和python混编

三种语言的混编的需要把前面的几种方法综合起来。

代码语言:javascript
复制
'''' 2>NUL
: '
@echo off
echo Run python from bat
python %0
goto :exit
'


echo Run python from shell;
exec python $0;

'''

import sys
print(sys.version_info)
exit(0)

'''' 2>/dev/null
:exit
:'''

原理基本上就是前面用到的,这里就不细说了。

0x06 总结

多语言代码混编在实际生产中并一定派的上用场,毕竟这样的代码基本跟天书没有什么差异。但作为一种折腾的乐趣,倒是可以尝试一下。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 前言
  • 0x01 小试牛刀
  • 0x02 bat与shell混编
  • 0x03 shell与python混编
  • 0x04 bat与python混编
  • 0x05 bat、shell和python混编
  • 0x06 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档