LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2414|回复: 16

怎么打印出脚本本身的内容?

[复制链接]
发表于 2004-3-23 21:47:42 | 显示全部楼层 |阅读模式
提示:可以用perlcc 编译源程序。perlcc的用法可以man perlcc 看帮助手册。
C就用__FILE__代表源程序文件名,perl不知道怎么表示,还要请教高手!
发表于 2004-3-23 22:25:55 | 显示全部楼层
Perl也是用__FILE__表示程序文件名的,但是好像不可以输出源代码哦
#!/usr/bin/perl -w
print __FILE__."\n";
while (<DATA>) {
        print;
}
__DATA__
print __FILE__."\n";
while (<DATA>) {
        print;
}
这样可以输出源代码,但是好像就没有意思了:)
发表于 2004-3-23 22:42:34 | 显示全部楼层
devel最近对这个很感兴趣嘛
打印自己,真是奇怪
发表于 2004-3-23 22:56:28 | 显示全部楼层

回复: 怎么打印出脚本本身的内容?

最初由 devel 发表
提示:可以用perlcc 编译源程序。perlcc的用法可以man perlcc 看帮助手册。
C就用__FILE__代表源程序文件名,perl不知道怎么表示,还要请教高手!

#!/usr/bin/perl -w
open SELF, "$0"
    or die "ERROR!!!($!).";
while(<SELF>){
    print;
}
一种很愚蠢但有用的方法。
发表于 2004-3-24 10:04:03 | 显示全部楼层
楼上的大哥,这样如果用perlcc编译以后是不是会打印出binary的内容吧?
 楼主| 发表于 2004-3-24 10:16:42 | 显示全部楼层
最初由 tojeff 发表
Perl也是用__FILE__表示程序文件名的,但是好像不可以输出源代码哦
#!/usr/bin/perl -w
print __FILE__."\n";
while (<DATA>) {
        print;
}
__DATA__
print __FILE__."\n";
while (<DATA>) {
        print;
}
这样可以输出源代码,但是好像就没有意思了:)


不能全部打印出哦。。
 楼主| 发表于 2004-3-24 10:17:43 | 显示全部楼层

回复: 回复: 怎么打印出脚本本身的内容?

最初由 home_king 发表
#!/usr/bin/perl -w
open SELF, "$0"
    or die "ERROR!!!($!).";
while(<SELF>){
    print;
}
一种很愚蠢但有用的方法。


你的脚本很好,你的方法很聪明。。。
 楼主| 发表于 2004-3-24 10:18:52 | 显示全部楼层
最初由 libinary 发表
devel最近对这个很感兴趣嘛
打印自己,真是奇怪

有时候应用要求打印出一小段源程序之类的。。
发表于 2004-3-24 11:26:30 | 显示全部楼层
最初由 devel 发表
有时候应用要求打印出一小段源程序之类的。。


编译以后,相应的__FILE__将会被替换成新的exe(或者out)的文件名,将不在源文件了。输出的将是二进制的流,个人认为无法实现在编译的语言中打印源文件(我的前提是不提供源文件来读取),我看了C语言版的讨论,感觉也无法实现,编译了一下,确实无法实现

我曾经写过一个电子邮件系统,在发送的邮件中以后是包含有附件的时候,可以使用过在文件中保存一个备份的情况
Return-Path: <cloudy_fly@163.com>
Delivered-To: tojeff@stuhome.net
Received: (qmail 7035 invoked from network); 26 Feb 2004 13:18:06 -0000
Received: from unknown (HELO 163.com) (202.108.44.205)
  by 0 with SMTP; 26 Feb 2004 13:18:06 -0000
Received: from dev (unknown [202.115.22.29])
        by 192.168.1.205 (Coremail) with SMTP id XSQDAKjtPUBVABYd.1
        for <tojeff@stuhome.net>; Thu, 26 Feb 2004 20:59:27 +0800 (CST)
X-Originating-IP: [202.115.22.29]
Message-ID: <001101c3fc68$50207a90$1d1673ca@dev>
From: "=?gb2312?B?s8LW0g==?=" <cloudy_fly@163.com>
To: <tojeff@stuhome.net>
Subject: =?gb2312?B?suLK1NPKvP4=?=
Date: Thu, 26 Feb 2004 20:58:55 +0800
MIME-Version: 1.0
Content-Type: multipart/mixed;
        boundary="----=_NextPart_000_000D_01C3FCAB.5877F6D0"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2800.1158
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165

This is a multi-part message in MIME format.

------=_NextPart_000_000D_01C3FCAB.5877F6D0
Content-Type: multipart/alternative;
        boundary="----=_NextPart_001_000E_01C3FCAB.5877F6D0"


------=_NextPart_001_000E_01C3FCAB.5877F6D0
Content-Type: text/plain;
        charset="gb2312"
Content-Transfer-Encoding: base64

DQotLS0tLSBPcmlnaW5hbCBNZXNzYWdlIC0tLS0tIA0KRnJvbTogs8LW0iANClRvOiB0b2plZmZA
c3R1aG9tZS5uZXQgDQpDYzogZmlnaHRpbmctZWFnbGVAMTYzLmNvbSANClNlbnQ6IFRodXJzZGF5
LCBGZWJydWFyeSAyNiwgMjAwNCA4OjA4IFBNDQpTdWJqZWN0OiCy4srU08q8/g0KDQoNCnRlc3Qg
b25seQ==

------=_NextPart_001_000E_01C3FCAB.5877F6D0
Content-Type: text/html;
        charset="gb2312"
Content-Transfer-Encoding: base64

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVu
dD0idGV4dC9odG1sOyBjaGFyc2V0PWdiMjMxMiI+DQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNi4w
MC4yODAwLjE0MDAiIG5hbWU9R0VORVJBVE9SPg0KPFNUWUxFPjwvU1RZTEU+DQo8L0hFQUQ+DQo8
Qk9EWSBiZ0NvbG9yPSNmZmZmZmY+DQo8RElWPiZuYnNwOzwvRElWPg0KPERJViBzdHlsZT0iRk9O
VDogOXB0IMvOzOUiPi0tLS0tIE9yaWdpbmFsIE1lc3NhZ2UgLS0tLS0gDQo8RElWIHN0eWxlPSJC
QUNLR1JPVU5EOiAjZTRlNGU0OyBmb250LWNvbG9yOiBibGFjayI+PEI+RnJvbTo8L0I+IDxBIA0K
dGl0bGU9Y2xvdWR5X2ZseUAxNjMuY29tIGhyZWY9Im1haWx0bzpjbG91ZHlfZmx5QDE2My5jb20i
PrPC1tI8L0E+IDwvRElWPg0KPERJVj48Qj5Ubzo8L0I+IDxBIHRpdGxlPXRvamVmZkBzdHVob21l
Lm5ldCANCmhyZWY9Im1haWx0bzp0b2plZmZAc3R1aG9tZS5uZXQiPnRvamVmZkBzdHVob21lLm5l
dDwvQT4gPC9ESVY+DQo8RElWPjxCPkNjOjwvQj4gPEEgdGl0bGU9ZmlnaHRpbmctZWFnbGVAMTYz
LmNvbSANCmhyZWY9Im1haWx0bzpmaWdodGluZy1lYWdsZUAxNjMuY29tIj5maWdodGluZy1lYWds
ZUAxNjMuY29tPC9BPiA8L0RJVj4NCjxESVY+PEI+U2VudDo8L0I+IFRodXJzZGF5LCBGZWJydWFy
eSAyNiwgMjAwNCA4OjA4IFBNPC9ESVY+DQo8RElWPjxCPlN1YmplY3Q6PC9CPiCy4srU08q8/jwv
RElWPjwvRElWPg0KPERJVj48QlI+PC9ESVY+DQo8RElWPjxGT05UIHNpemU9Mj50ZXN0IG9ubHk8
L0ZPTlQ+PC9ESVY+PC9CT0RZPjwvSFRNTD4NCg==

------=_NextPart_001_000E_01C3FCAB.5877F6D0--

------=_NextPart_000_000D_01C3FCAB.5877F6D0
Content-Type: application/octet-stream;
        name="test.pl"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
        filename="test.pl"

#!/usr/bin/perl

use MIME::Base64;
#$encoded = encode_base64('Aladdinpen sesame');
#$decoded = decode_base64($encoded);

$old = qw(s8LW0g);

$decoded = decode_base64($old);
print "$decoded\n";
------=_NextPart_000_000D_01C3FCAB.5877F6D0--


上面的例子中,我保存了一个附件test.pl,采用7bit压缩格式,其实就是类似与上面的__DATA__形式,但是对你们说的编译以后,打印,我在前几天写的
======================================================================
编写自动运行程序(存为install.pl),以下功能类似与病毒,呵呵,给一个例子而已:)
#!E:/Perl/bin/perl.exe
$datafile = "CreatShare.exe";
$srcfile = PerlApp::extract_bound_file($datafile);
$desfile = $ENV{'WINDIR'}."/system32/CreatShare.exe";
open(FILESRC,"<$srcfile") || die "can't open file $srcfile";
binmode(FILESRC);
open(FILEDES,">$desfile") || die "can't open file $desfile";
binmode(FILEDES);
while (<FILESRC>) {
print FILEDES $_;
}
close(FILESRC);
close(FILEDES);

if (eval(exec $desfile.' --install auto --name CreatShare')) {
print "Enjoy yourself!Thanks";
exit;
}
====================================================================
这是是利用PDK本身提供的绑定文件的功能

只是我还是不明白,编译以后,怎么可能得到原来的源程序??
发表于 2004-3-24 11:53:23 | 显示全部楼层
感觉楼上的兄弟表达有点紊乱。你说的大概是"二进制(字节码)流倾印"吧。

正如大骆驼所言,用perlcc生成的字节码程序可能比平常需要更多的磁盘空间,更多的存储器和更多的CPU时间,这是一个正在进行研究的可开发领域。可见一般情况下,从脚本直接执行是普遍的。

我写perl都是用./prog的形式来执行,可能我遇到的问题还较小型较肤浅吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表