作为服务运行时通过 Perl system() 调用运行 SCP

作为服务运行时通过 Perl system() 调用运行 SCP

我创建了一个 Debian 风格的服务,用于监视数据库并根据数据库中的数据将文件复制到远程机器。

当它“独立”运行时,整个过程运行良好,但是,当我将其作为服务运行时/etc/init.d/MonDB start(可以正常工作),作为服务,scp 将无法工作,错误代码为 256,我将其移位以获取代码 1。根据文档,这只是一个“一般错误”,并没有告诉我为什么它无法工作。

我一直在互联网上搜索但找不到答案。

我在哪里:

  • 密码提示已被禁用,因为我已经将 scp 设置为无密码登录。有效。
  • 我已尝试使用-i它将其指向我的身份文件。
  • 我尝试使用 -v 从该进程中获取更多数据,但没有返回任何附加数据。
  • 我删除了严格的主机检查,以为可能存在问题,但我怀疑这是一个问题。

它可以独立运行,因此语法和值都很好。

我使用 LIST 形式system() (perl system() 调用)所有条目都在单独的元素中。(再次强调,所有这些都是独立工作的。)

system (@PostCMD) == 0 or logEntry ("system @PostCMD failed: $?, $!");
if ($? == -1) {
    logEntry ( "failed to execute: $!\n" );
} elsif ($? & 127) {
    logEntry ( "child died with signal %d, %s coredump\n",
     ($? & 127),  ($? & 128) ? 'with' : 'without' );
} else {
    my $err = $? >> 0;
    logEntry ("child exited with value $err\n");
}

我的日志显示:(出于安全考虑,删除了关键部分。)

2015-02-11 22:08:32 system /usr/bin/scp -v -i /home/*****/.ssh/id_rsa 
  -o StrictHostKeyChecking=no /*********file-to-copy******.ext
  [email protected]:/xxx/dest/xxx failed: 256, 
2015-02-11 22:08:32 child exited with value 256

我认为这不是 Perl 的问题,而是为什么当 STDIN、STDOUT 和 STDERR 被剪掉时 SCP 无法运行,也不是从 shell 运行,而是作为服务运行。

scp 在服务(或从服务器进程)上下文中需要操作什么?

答案1

答案:在本地 root 账户下设置 scp 和 ssh 的无密钥登录到正在登录的远程用户账户。

知道了!

当我测试它时,我以我的用户ID登录,但是当它作为服务运行时,它是以root身份运行的。

我将打开 STDOUT 和 STDERR 的打开命令更改为 /dev/null,并将它们写入文件。当我这样做时,我从 scp 获得了 -v 形式的输出。发生的事情是,scp 正在运行 ssh,但没有传递我的身份文件 -i 命令,因此它被拒绝访问,因为有效用户 ID 是 root,而 root 在远程计算机上没有我在该计算机上的用户帐户的密钥供 ssh 使用。

我按照设置无密码登录的步骤进行了操作,但以本地 root 身份登录到我的远程普通用户帐户。

因此,我的远程登录(非 root)拥有我的本地普通用户帐户和本地 root 帐户的两个密钥,之后它就开始工作了。

现在,使用 scp 作为服务器服务,该过程运行正常。scp 没有将 -i 选项传递给 ssh,这是造成这种混乱的原因。

希望这可以帮助任何尝试使用 scp 形式 cron 或其他服务器服务类型脚本的人。

相关内容