![作为服务运行时通过 Perl system() 调用运行 SCP](https://linux22.com/image/868203/%E4%BD%9C%E4%B8%BA%E6%9C%8D%E5%8A%A1%E8%BF%90%E8%A1%8C%E6%97%B6%E9%80%9A%E8%BF%87%20Perl%20system()%20%E8%B0%83%E7%94%A8%E8%BF%90%E8%A1%8C%20SCP.png)
我创建了一个 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 或其他服务器服务类型脚本的人。