SCP命令行和PHP exec()不做相同的事情

SCP命令行和PHP exec()不做相同的事情,php,linux,apache,ssh,scp,Php,Linux,Apache,Ssh,Scp,当我在命令行上运行此命令时: 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

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

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\u dump
执行
exec
的结果时,我得到一个
NULL


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

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

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

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


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