2013-04-23 64 views
0

当我在命令行中运行以下命令:SCP命令行和PHP的exec()不能做同样的事情

scp -i private.ppk -P 22 foo.txt [email protected]:/home/someuser/foo.txt 

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

$command = 'scp -i private.ppk -P 22 foo.txt [email protected]:/home/someuser/foo.txt'; 
exec($command); 

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

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

+0

尝试使用完整的路径foo.txt的 – Rob 2013-04-23 02:40:30

+0

OK,我做到了。这绝对是一个问题。不过,我仍然得到相同的结果。没有文件传输。 NULL是'exec'的结果。 – snoopy76 2013-04-23 02:48:35

+0

我的脚本是作为'nobody'运行的。这会导致任何问题吗? – snoopy76 2013-04-23 02:52:28

回答

1

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

也就是说,您使用* .ppk(这是PuTTY键使用的扩展名) - OpenSSH不支持这一点有点奇怪。我的建议是使用phpseclib's SCP client。您可以在PHP文件本身中将键作为字符串使用,而不必让它们存在于文件系统中。更多信息:

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