将perl脚本/ dbm移动到新服务器,并转出dbm?

时间:2009-11-11 21:48:33

标签: database perl content-management-system mirroring dbm

我的任务是将网站镜像到新服务器上。旧网站有一些Perl脚本,就我在内部看到的而言(我对Perl一无所知,虽然我对编码有很好的理解,特别是PHP / js / etc)并不依赖于旧的服务器。也就是说,当我尝试运行这个通过数据库文件查找相应文章文件的脚本时,它不会检索任何内容。

基本上,这是一个基本的旧CMS,正如我解释的那样,它在PAG文件中搜索文件名并显示它。我在这里有点失落。有没有理由说镜像在新网站上不起作用?我已经检查了权限,我已经检查过Perl是否安装在同一个 / usr / etc 目录中。我认为它使用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文件,尽管它存在(两篇文章文章。 pag和articles.dir,但变量只在正确的目录中引用“文章”而没有扩展名)并具有正确的权限......所以,这里的问题现在到底是怎么回事?是这些不同版本的perl?或者我只是做一些基本和愚蠢的事情?为了记录(是的,它的可怕)我还没有shell访问权限,虽然我正在努力...我被要求这样做是因为我的“新网络”技能,我当然不是合适的像perl和dbm这样的人,虽然我可以读取文件并理解它们。作为最后的建议,有没有人知道如何(一个脚本或类似的东西)我可以问原始服务器的人(谁不是编码员)对此进行ASCII转储,或者是否会脱节?我需要将其转换为CSV并返回到文件中,以便我可以在另一个数据库中重复使用它......这真是一场噩梦!

3 个答案:

答案 0 :(得分:1)

如果我正确地阅读了您的问题,那么您在新机器上打开数据库时会遇到困难。数据库是否存在?

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

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

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

(现在,如果您找到了数据库,但是您无法打开它,那么您还有其他一些问题。但是,我处理PAG文件已经很长时间了。)

答案 1 :(得分:1)

您是否仍然可以访问原始计算机?

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

答案 2 :(得分: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”它可能会创建“foo.db”。取决于实施。见下文。

另一种可能性是你的两个Perls试图用两个不同的DBM实现来打开文件。可以在不同的机器上使用不同的DBM实现编译Perl。 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不是字节顺序问题,现在几乎所有东西都是x86不太常见。

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