【发布时间】:2017-09-13 03:38:02
【问题描述】:
我希望 PHP 将 myfile.txt 发送到使用密码登录的远程 SSH。
从 OSX bash 我使用这个命令手动发送文件:
scp /Users/myname/Documents/myfile.txt root@192.168.1.116:/Docs/myfile.txt
因为我需要通过 PHP 来完成,所以我制作了这个 upload.sh bash 脚本:
#!/usr/bin/expect
spawn scp /Users/myname/Documents/myfile.txt root@192.168.1.116:/Docs/myfile.txt
expect "root@192.168.1.116's password:"
send "mYpassWORD\r"
interact
我可以在终端中使用:./update.sh 运行上面的代码,它会根据需要发送文件。
现在的问题是当我在 PHP 中添加这个 bash 脚本时,它不发送文件。
我试过了:
exec('/Library/WebServer/update.sh 2>&1', $output);
print_r($output);
我被这个错误/消息卡住了:
Array
(
[0] => spawn scp /Users/myname/Documents/myfile.txt root@192.168.1.116:/Docs/myfile.txt
[1] => root@192.168.1.116's password:
)
在 bash 中发送密码并且一切正常,通过 PHP 它不会上传文件。 我还注意到我第一次通过 PHP 运行它时说 SSH 主机密钥不匹配,所以我将 .ssh 文件夹复制到服务器根位置并且该错误消失了。
任何人都可以请帮助如何使它工作? 谢谢
【问题讨论】:
-
您是否尝试过生成一对 SSH 密钥并将您的公钥添加到服务器的
~/.ssh/authorized_keys文件中?这样就不需要输入密码,也不需要expect。 -
@RuslanOsmanov 抱歉,不确定。当我通过终端登录时,它询问我是否要将其保存在 .ssh 中,我写了是。但是当使用 PHP 那么 Owner 是 WWW 意味着不同的帐户?我将 .ssh 文件夹复制到服务器,现在它不需要密钥。我还没有生成
authorized_keys。我只有known_hosts。我怎样才能做到这一点?谢谢 -
你不应该把你的私钥给任何人(!)。握手是通过公钥完成的。受信任的公钥应该注册在服务器的
~/.ssh/authorized_keys文件中,并且公钥应该仅保存在客户端的机器上。可以使用ssh-keygen实用程序生成一对 SSH 密钥。例如,请参阅instructions on GitHub。 -
@RuslanOsmanov 我在本地掩码和远程也生成了密钥。但遥控器仍然要求输入密码。从本地访问时,我应该使用远程公钥还是私钥?我都试过了,但没有运气。我试过了:
ssh -i id_rsa.txt root@192.168.1.116 -
在本地机器上生成一对密钥。将您的公钥放入
$HOME/.ssh/authorized_keys,其中$HOME是root的主目录。检查 SSH 服务器配置 (/etc/ssh/sshd_config) 是否与您的设置匹配;AuthorizedKeysFile选项尤为重要。您可以使用 SSH 客户端的-v选项进行调试,例如ssh -vvv root@...