【问题标题】:SCP command line and PHP exec() not doing the same thingSCP 命令行和 PHP exec() 没有做同样的事情
【发布时间】:2013-04-16 02:41:57
【问题描述】:

当我在命令行上运行它时:

scp -i private.ppk -P 22 foo.txt someuser@domain.com:/home/someuser/foo.txt

一切正常。 foo.txt 被转移到远程服务器没有任何问题。我需要从 PHP 运行完全相同的命令。所以,我有以下代码:

$command = 'scp -i private.ppk -P 22 foo.txt someuser@domain.com:/home/someuser/foo.txt';
exec($command);

这不起作用。 PHP 文件正在与private.ppk 相同的目录中执行。当我var_dumpexec 的结果时,我得到一个NULL

我想知道这是否是权限问题。我知道我在命令行上运行谁,但我不确定谁在运行脚本。这可能是问题吗?还是完全不同?

【问题讨论】:

  • 尝试使用 foo.txt 的完整路径
  • 好的,我做到了。这绝对是个问题。但是,我仍然得到相同的结果。没有文件传输。 NULL 是exec 的结果。
  • 我的脚本以nobody 运行。这会导致任何问题吗?
  • nobody 运行的脚本在读取foo.txt 时应该不是问题,但是读取私钥文件可能是问题。尝试将 ppk 复制到 /home/nobody/.ssh/private.ppk。请务必将chown 也发送给nobody 用户。
  • 更多奇怪的问题。首先,我在私钥文件上做了一个file_exists。它返回一个TRUE。但是当我把它放在/home/foo/.ssh/private.ppk 中时,我得到一个FALSE。请注意,我必须将它放在“foo”中(“foo”是一个确实存在于 /home/ 下的文件夹)。我不能把它放在/home/nobody/.ssh/ 因为nobody 不存在;我应该创建它吗?我知道 PHP 以“nobody”运行,因为我从 PHP 中回显了 whoami 的结果。

标签: php linux apache ssh scp


【解决方案1】:

我认为这是一个权限问题。 SSH 客户端通常会拒绝连接,除非权限已设置为第三方(例如用户“nobody”)无法读取密钥。

也就是说,您使用 *.ppk 有点奇怪 - 这是 PuTTY 密钥使用的扩展 - OpenSSH 不支持。

也就是说,我的建议是使用phpseclib's SCP client。此时您可以将密钥作为字符串保存在 PHP 文件本身中,而不必将它们保存在文件系统中。更多信息:

https://github.com/phpseclib/phpseclib/blob/master/phpseclib/Net/SCP.php

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多