[英]PHP - How to SCP local file from BASH OSX to remote via SSH with Password in PHP?
我希望PHP将myfile.txt发送到使用密码进行登录的远程SSH。
我从OSX bash使用以下命令手动发送文件:
scp /Users/myname/Documents/myfile.txt root@192.168.1.116:/Docs/myfile.txt
由于我需要通过PHP进行此upload.sh
,因此制作了这个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文件夹复制到服务器根目录,该错误消失了。
任何人都可以帮助如何使其工作吗? 谢谢
我找到了解决方案并使它正常工作,但不确定这是否正确。 问题与密码无关。 问题是/曾经:Bash脚本太快了。 还是PHP太快了?
无论如何,我通过在send "mYpassWORD\\r"
之后添加sleep
来解决了我的问题。 这是我可以使用的Bash命令,可以从PHP访问该命令以使用密码将文件发送到远程:
#!/usr/bin/expect
spawn scp /Library/WebServer/Documents/test34/myfile.txt root@192.168.1.116:/Docs/myfile.txt
expect "root@192.168.1.116's password:"
send "mYpassWORD\r"
sleep 0.2
interact
我将其保存为: update.sh
并执行chmod +x update.sh
然后在PHP文件中: index.php
我写道:
<?php
$do = shell_exec("(/Library/WebServer/Documents/test34/update.sh)");
var_dump($do);
?>
并得到以下成功结果 :
string(320) "spawn scp /Library/WebServer/Documents/test34/myfile.txt root@192.168.1.116:/Docs/myfile.txt
root@192.168.1.116's password:
myfile.txt 0% 0 0.0KB/s --:-- ETA
myfile.txt 100% 3649 3.6KB/s 00:00
"
因此,只需在Bash脚本中添加sleep 0.2
解决此问题。
我也尝试过sleep 0.1
但随后出现错误。 因此,睡眠时间可能取决于文件的大小? myfile.txt只有3.6kb,0.2秒的睡眠效果很好。
如果文件较大,则可以尝试sleep 1
或sleep 5
等。
这种方法可以解决问题,但并不安全,因为如果每次调用文件大小不同或ssh连接速度慢时,该方法都可能会失败。
如果有人可以为改善这个答案做出贡献,我将非常感激。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.