2009-11-11 54 views
0

我的任务是将镜像映射到新服务器上。旧网站有几个Perl脚本,就我所能看到的内部而言(我对Perl一无所知,尽管我对编码有很好的理解,特别是PHP/js /等)不依赖于旧的服务器。也就是说,当我尝试运行这个脚本时,它通过查找数据库文件来查找适当的文章文件,但它不检索任何内容。移动一个perl脚本/ dbm到一个新的服务器,并移出dbm?

基本上,这是一个基本的旧的CMS,我解释它,它在那里搜索PAG文件的文件名并显示它。我有点迷失在这里。是否有一个原因,为什么镜像不适用于新网站?我检查了权限,我检查了Perl安装在相同的目录下。我觉得它使用DBM因为,according to another article,如果我看到这样的命令:

dbmopen(%ARTS, $art_dbm, 0644); 
$entry = $ARTS{$article_id}; 
dbmclose(%ARTS); 

它必须是DBM,对不对?

在相关说明中,是否有任何方法可以将PAG文件的信息与原始文件合并,而无需使用难以置信的复杂Perl脚本;即使用文件本身的信息重新创建100个文本文件,而不是单独存储?

编辑:感谢下面的第一个答案。你能解释一下HASH可能是什么,以及面具吗?我已经重新检查.pag文件(数据库名称)的确在前面在.pl文件中定义的位置,并且它是以二进制形式传输的。但不知何故,我不能让它正确地打开它!

编辑3:好了,对不起,这是最后编辑:我使用的模具下面的代码(Shwern),发现它没有发现DB文件,尽管它在那里(两个文件articles.pag和文章。目录,但变量只引用“文章”没有扩展名)在正确的目录和正确的权限...所以,这里的问题是现在到底是怎么回事?这些是不同版本的Perl吗?或者我只是在做一些基本和愚蠢的事情?为了记录(是的,它的可怕)我还没有shell访问,虽然我正在处理它...我被要求这样做,因为我的“新网络”技能,我当然不是合适的像perl和dbm之类的人,尽管我可以读取这些文件并理解它们。作为最终的建议,有没有人知道(一个脚本或类似的东西)我可以问原始的服务器人员(谁不是编码人员)做这个ASCII转储,或者是不符合要求?我需要将其转换为CSV并返回到文件中,以便我可以在另一个数据库中重复使用它......呃真是一场噩梦!

回答

1

如果我正确地读你的问题,你很难在新机器上打开数据库。数据库是否存在?

dbmopen方法的文档可通过perldoc -f dbmopen(以及此链接获取最新稳定的perl版本,5.10.1)在命令行上获得。

正如您从文档中看到的,dbmopen的第二个参数包含打开的文件名。在你粘贴的代码中,它包含在标量变量$art_dbm中。所以你需要做的是寻找一些此变量的早期声明(可能是从配置文件中加载,或者可能是硬编码的)。然后,一旦你找到了那个数据库,所有需要的就是将这个文件转移到你的新机器上。

如果您需要更多的帮助解密代码,请随时用代码片段编辑您的问题,我们可以从那里开始。

(现在,如果你已经找到了数据库,但你不能打开它,你还有其他的问题。它一直以来我处理然而,随着PAG文件很长一段时间。)

1

你还能访问原始机器吗?

尽管您使用的是DBM文件,但实际功能可能来自多个实现之一,其中一些实现不兼容。我会用创建它的相同perl转储文件,然后用新的perl重新创建它。

0

有几件事情可能会出错。最明显的是dbmopen()调用不打开文件。如果DBM文件不存在,而不是失败,则dbmopen()只是创建一个新的文件,这可能是它为什么显示为空。

要消除这种可能性,请确保DBM文件确实存在且可读。您还想检查dbmopen()是否成功,如果格式不正确,它将(通常)错误。

die "$art_dbm does not exist" unless -e $art_dbm; 
die "Cannot read $art_dbm" unless -r $art_dbm; 
dbmopen(%ARTS, $art_dbm, 0644) or die "dbmopen of $art_dbm failed: $!"; 

不幸的是dbmopen()对自己的好处太聪明了。如果你给它“富”,它可能而不是创建“foo.db”。取决于实施。见下文。

另一种可能性是您的两个Perls尝试用两种不同的DBM实现打开文件。 Perl可以在不同的机器上使用不同的DBM实现集进行编译。 dbmopen()将使用第一个硬编码(和历史上的barnacled)列表。它实际上是一个围绕AnyDBM_File的包装。您可以检查正在使用哪个实施...

use AnyDBM_File; 
print "@AnyDBM_File::ISA\n"; 

确保它们是相同的。如果不是,请在使用dbmopen之前加载有问题的DBM库。 perldoc -f dbmopen解释。

这是一个演示。首先我们看看dbmopen()将默认使用什么。

$ perl -wle 'use AnyDBM_File; print "@AnyDBM_File::ISA"' 
NDBM_File 

然后创建并填充dbm文件。

$ perl -wle 'dbmopen(%foo, "tmpdbm", 0644) or die $!; $foo{23} = 42; print %foo' 
2342 

现在证明我们可以阅读它。

$ perl -wle 'dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo' 
2342 

并尝试使用不同的DBM实现读取它。

$ perl -wle 'use GDBM_File; dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo' 

文件中没有内容,但也没有错误。原来它创建了一个名为tmpdbm的文件,而ndbm使用的是tmpdbm.db。我们来试试Berkeley DB。

$ perl -wle 'use DB_File; dbmopen(%foo, "tmpdbm", 0644) or die $!; print %foo' 
Inappropriate file type or format at -e line 1. 

至少有一个错误。

最好的办法是找出原始机器正在使用的DBM实现,并在dbmopen()调用之前使用该模块。这将使情况变得静止。

PS Unix的file实用程序也会给你一个好主意,它是什么类型的DBM。

$ file tmpdbm 
tmpdbm: GNU dbm 1.x or ndbm database, little endian 
$ file tmpdbm.db 
tmpdbm.db: Berkeley DB 1.85 (Hash, version 2, native byte-order) 

,并希望$diety它不是一个字节顺序的问题,不太常见的,现在几乎所有的东西是86。

PPS正如你所看到的,使用DBM文件有点混乱。奇怪的考虑它应该只是一个磁盘哈希。

相关问题