当前位置: 首页 > 知识库问答 >
问题:

PHP-如何SCP本地文件从BASH OSX到远程通过SSH密码在PHP?

吴同
2023-03-14

我想PHP发送myfile.txt到远程SSH使用密码登录。

在OSX bash中,我使用以下命令手动发送文件:

scp /Users/myname/Documents/myfile.txt root@192.168.1.116:/Docs/myfile.txt

因为我需要通过PHP来完成,所以我制作了这个upload.shbash脚本:

#!/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

我可以使用:运行上述代码/使现代化sh在终端中,它根据我的需要发送文件。

现在的问题是,当我在PHP中添加这个bash脚本时,它不会发送文件。

我曾经尝试过:

exec('/Library/WebServer/update.sh 2>&1', $output);
print_r($output); 

我被这个错误卡住了/msg:

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文件夹复制到服务器根位置,错误消失了。

有人能帮我怎么做吗?非常感谢。

共有1个答案

谭曦
2023-03-14

我找到了一个解决方案,并使其发挥作用,但不确定这是否是正确的方法。该问题与密码无关。问题是:Bash脚本太快了。或者PHP太快了?

无论如何,我解决了我的问题,在发送mYPassWORD\r后添加睡眠。这是我的工作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和didchmod x更新。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脚本中添加sleep0.2就解决了这个问题。

我还尝试了sleep0.1,但后来出现了错误。因此,睡眠时间可能取决于您的文件有多大?我的文件。txt只有3.6kb,0.2秒睡眠效果很好。

如果文件较大,可以尝试sleep 1sleep 5等。。

这种方法可以解决这个问题,但感觉不安全,因为如果文件大小在每次调用中变化,或者如果ssh连接缓慢,它可能会失败。

如果有人能为改进这个答案做出贡献,我将不胜感激。

 类似资料:
  • 如何使用将文件夹从远程复制到本地主机? 我使用登录我的服务器。 然后,我要将远程文件夹复制到本地。 我如何实现这一点?

  • 问题内容: 我正在尝试使用运行 (安全副本)命令。登录名要求我发送密码: 这立即返回错误: 我 确定 密码正确。我可以通过在外壳上手动调用来轻松验证它。那为什么不起作用呢? 请注意,有许多与此类似的问题,询问并发送用于自动SSH或FTP登录的密码 这些问题的答案不起作用和/或不适用,因为我使用的是Python 3。 问题答案: 您链接的第二个答案建议您使用Pexpect(这通常是与需要输入的命令行

  • 我正试图使用MacBook上的scp将本地文件复制到远程服务器。 当我知道文件存在(我已经检查并重新检查了路径)时,我不断地得到错误“没有这样的文件或目录”。该文件具有u、g和O的文件rwx权限。文件不是符号链接。 文件a2.pdf位于本地计算机的根目录中。我还复制了路径,就像我使用pwd时所显示的那样,它包含在目录中,如下所示: 我正在登录到远程服务器时启动此命令。给出了本地路径的错误。

  • 问题内容: 我是一名盲人学生,目前正在系统admin/shell编程课程中。尽管ssh可以很好地执行ls,pwd等命令,但编辑器不能与我的屏幕阅读器和ssh会话配合使用。我想知道是否可以在ssh上挂载Linux文件夹,使其显示为Windows驱动器?这样,我可以使用可访问的软件编辑所需的任何文件,而不必经常使用SCP来回发送文件。 问题答案: 早在2002年,Novell就开发了一种名为NetDr

  • 本文向大家介绍PHP实现远程下载文件到本地,包括了PHP实现远程下载文件到本地的使用技巧和注意事项,需要的朋友参考一下 代码很简单就不多废话了,直接奉上: 再来个远程下载文件到服务器 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 我能做些什么,让它发挥作用,有什么建议吗? 提前感谢!