从PHP脚本的SSH命令 – 什么也没有,但在CMD线

我正在研究一个EC2盒子,并试图用SSH命令另一个盒子。

该命令在命令行中工作,甚至php -a交互。 但是,当以apache运行时,它不起作用。 示例cmd: –

system('ssh -i /home/me/keys/key.pem [email protected] "ls"'); 

我已经尝试添加Apache的轮组,并在两个盒子上。 我也试过把pem文件转换成apache。 没有。

然而,其他两个用例中的命令反应很好。

这里发生了什么? 有人知道吗?

第一; 尝试运行它作为Web服务器用户,例如:

 sudo -u www-data <whatever_command> 

第二; 确保你不仅捕获你正在执行的命令的结果,而且捕获它所抛出的行。 你可以在PHP中使用:

 string exec ( string $command [, array &$output [, int &$return_var ]] ) 

http://www.php.net/manual/en/function.exec.php

第三:请回来一个工作的答案。

您需要在ssh命令选项中指定用户:

 system('ssh -i /home/me/keys/key.pem [email protected] "ls"'); 

这可能仍然不能工作,除非Apache有权访问您的key.pem文件,这将是一个巨大的安全漏洞。 我真的build议使用一些ssh库(像其他人所build议的那样),并使用它自己的ssh密钥设置apache,然后设置连接到的服务器,并减less对该帐户的访问权限。

你需要使用php openssh库来正确运行这些命令,否则会危及你系统的安全。

我的build议是使用phpseclib,一个纯粹的PHP SSH实现 。 例如。

 <?php include('Net/SSH2.php'); $key = new Crypt_RSA(); $key->loadKey(file_get_contents('/home/me/keys/key.pem')); $ssh = new Net_SSH2('ip-xx-xxx-xxx-xxx-end.ip'); if (!$ssh->login('user', $key)) { exit('Login Failed'); } echo $ssh->exec('ls'); //echo $ssh->read('username@username:~$'); //$ssh->write("ls -la\n"); //echo $ssh->read('username@username:~$'); ?>