【问题标题】:Executing rsync via web server bash script not working通过 Web 服务器 bash 脚本执行 rsync 不起作用
【发布时间】:2018-01-12 02:28:14
【问题描述】:

我有一个触发 bash 脚本的简单 web php 脚本

<?php
 if(isset($_POST['submit']))
 {
   $output=shell_exec('sh /usr/lib/cgi-bin/script.sh');
   echo $output;
 }
?>

<form action="" method="post">
<input type="submit" name="submit" value="Call my Shell Script">
</form>

我在脚本中尝试了简单的命令,例如重命名和触摸,它似乎工作正常。

rsa 密钥已设置并且 rsync 可以从终端运行,但我得到以下信息:

Host key verification failed.^M
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.1]
Could not create directory '/var/www/.ssh'.^M
Host key verification failed.^M
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.1]

脚本内容:

rsync -azv -e 'ssh -p 2222' /home/downloads/ user@ip:/home/downloads

我可能错了,但这似乎是权限问题?

【问题讨论】:

    标签: php linux bash cgi-bin


    【解决方案1】:

    您的问题来自“主机密钥验证失败”。

    脚本由您的 www 用户(apache、www-data、...)执行。 在您的 /etc/passwd 中,您可能已经将该用户的主目录定义为 /var/www。

    如果该用户在该目录中没有权限,则它无法创建 .ssh 文件夹来存储远程计算机的主机密钥。

    所以,你可以手动创建文件夹:

    sudo mkdir /var/www/.ssh
    sudo chmod 600 /var/www/.ssh
    sudo chown <your-www-user> .ssh
    

    这是第一步,但是 rsync 仍然会失败,因为您必须接受远程主机密钥。

    所以,第二步是通过 SSH 连接到远程主机以获取远程主机密钥

    su - <your-www-user>
    ssh -p 2222 user@ip
    

    第三个问题,登录。您应该为每个密钥配置一个 SSH 连接,以避免在每次连接时都必须输入密码(无论哪种方式,您的 rsync 都会失败)。

    所以,要生成 ssh 密钥:

    su - <your-www-user>
    ssh-keygen -t rsa
    

    将您的 ssh 公钥复制到远程主机:

    su - <your-www-user>    
    ssh-copy-id user@ip
    

    这应该可以解决问题。

    【讨论】:

    • 我如何找出 apache 正在使用的用户?
    • run phpinfo() 会给你答案,或者你可以检查你的网络服务器配置文件(例如对于 Apache:/etc/apache2/httpd.conf)
    • 宾果游戏!像魅力一样工作!谢谢!
    最近更新 更多