我在本地服务器和远程服务器之间设置了passpahse
我直接在linux中尝试此命令(其中file是单个文件,$ remote是远程服务器)
scp $ file root @ $ remote:/ tmp /
工作正常
我尝试在shell脚本中编写命令并在linux上调用它,它也可以工作
但如果我尝试从php调用shell脚本,它只输出错误(来自我的日志记录)
无法创建目录'/var/www/.ssh'。
主机密钥验证失败。
怎么回事?
答案 0 :(得分:1)
你的php没有像你一样运行,或者至少有一个更改的root,因此它将其主页视为/ var / www /,其中不包含.ssh文件夹(以及所需文件)。
如果在/ var / www中添加.ssh,请确保.ssh由php运行的用户拥有,并且文件具有正确的属性(谁可以读/写文件)。
答案 1 :(得分:1)
首先在您的脚本中尝试:
whoami
如果用户为www-data
,请在/var/www
中创建目录.ssh。然后将此目录/var/www/.ssh
提供给用户的所有者和组,您的PHP运行。
对我来说(Perl-Script)这个效果很好,虽然在启动我的脚本(sFTP)后目录中没有任何内容。
答案 2 :(得分:0)
您的普通用户帐户存储了ssh密钥(默认情况下,它们存储在$HOME/.ssh
中),而不是Web服务器用户,这就是在shell中使用它而不是从浏览器中运行命令时运行正常的原因。浏览器进程尝试在其主目录中创建.ssh
目录,但未能这样做,因此无法继续。
您应该使用ssh2_scp_send
从PHP执行此操作。
答案 3 :(得分:0)
在/var/www
中创建一个虚拟目录,然后运行mkdir /var/www/.ssh
和chown -R www-data:www-data /var/www/.ssh
这应该可以解决您的问题。
shell_exec('/usr/bin/scp $file root@$remote:/tmp/')