用于远程传输文件的linux命令和shell脚本

用于远程传输文件的linux命令和shell脚本,shell,Shell,我已经在本地服务器和远程服务器之间设置了passpahse 我直接在linux中尝试这个命令(其中file是单个文件,$remote是远程服务器) scp$文件根@$远程:/tmp/ 它很好用 我尝试用shell脚本编写命令,并在linux上调用它,它也可以工作 但是如果我尝试从php调用shell脚本,它只会输出错误(从我的日志记录中) 无法创建目录'/var/www/.ssh' 主机密钥验证失败 为什么?您的php没有像您一样运行,或者至少有一个已更改的根目录,因此它将其主目录视为/var/

我已经在本地服务器和远程服务器之间设置了passpahse

我直接在linux中尝试这个命令(其中file是单个文件,$remote是远程服务器)

scp$文件根@$远程:/tmp/

它很好用

我尝试用shell脚本编写命令,并在linux上调用它,它也可以工作

但是如果我尝试从php调用shell脚本,它只会输出错误(从我的日志记录中)

无法创建目录'/var/www/.ssh'

主机密钥验证失败


为什么?

您的php没有像您一样运行,或者至少有一个已更改的根目录,因此它将其主目录视为/var/www/,其中不包含.ssh文件夹(以及所需的文件)


如果您在/var/www中添加了一个.ssh,请确保.ssh由运行php的用户所有,并且文件具有正确的属性(可以读取/写入文件)。

您的普通用户帐户存储了ssh密钥(默认情况下,它们存储在
$HOME/.ssh
)不是web服务器用户,这就是为什么在shell中而不是从浏览器中使用命令时,命令运行良好。浏览器进程尝试在其主目录中创建
.ssh
目录,但失败,因此无法继续


您应该使用从PHP执行此操作。

首先在脚本中尝试以下操作:

whoami
如果用户是
www-data
,请在
/var/www
中创建一个目录.ssh。然后给这个目录
/var/www/.ssh
用户的所有者和组,PHP运行


对我来说(Perl脚本),这很好,尽管启动脚本(sFTP)后.ssh目录中没有任何内容。

/var/www
中创建一个虚拟目录,然后运行
mkdir/var/www/.ssh
chown-R www-data:www-data/var/www/.ssh

这会解决你的问题。
shell\u exec('/usr/bin/scp$file root@$remote:/tmp/)

我想是的,我应该如何配置它您可以将私钥和公钥添加到www文件夹中吗?或者你是在问如何像你一样运行php?我建议不要使用后者。我尝试复制,但在复制并运行之后,会出现权限被拒绝的情况,因为目录已设置为与原始目录相同,是否有其他方式,如按您的方式运行php?检查哪些用户以运行php,并确保.ssh上的访问设置(end everything in it is correct)和php用户所有。除了scp,我的shell脚本做很多事情,比如打包文件然后发送到远程服务器,所以我不认为ssh2\U scp\U send可以做到这一点