具备入门编程能力如何用PHP在局域网内实现SCP文件传输
适合新手的局域网PHP跨设备文件传输方案
方案1:直接调用系统已验证的scp命令(零扩展安装成本)
你已经确认可以在命令行执行scp,PHP可以通过exec()/shell_exec()函数直接调用你熟悉的scp命令,不需要掌握ssh扩展的复杂用法,只需要提前配置好设备间的ssh免密登录,避免命令行交互输入密码即可。
- 配置免密登录(仅需操作一次):在PHP运行的设备上执行
ssh-keygen生成密钥,然后执行ssh-copy-id 目标设备用户名@192.168.1.xxx把公钥传到目标设备,后续scp就不需要输入密码了。 - 下载文件示例代码:
<?php // 从目标设备下载文件到本地路径 $remote_path = '用户名@192.168.1.100:/home/xxx/target.txt'; $local_path = '/var/www/local_save.txt'; // 加-q参数静默执行,避免输出无关日志 $command = "scp -q {$remote_path} {$local_path}"; // 执行命令,返回执行结果状态 exec($command, $output, $return_var); if ($return_var === 0) { echo "文件下载成功"; } else { echo "文件下载失败,错误码:{$return_var}"; } ?>
- 上传文件示例代码:
<?php $local_path = '/var/www/upload_file.txt'; $remote_path = '用户名@192.168.1.100:/home/xxx/save_path/'; $command = "scp -q {$local_path} {$remote_path}"; exec($command, $output, $return_var); if ($return_var === 0) { echo "文件上传成功"; } else { echo "文件上传失败,错误码:{$return_var}"; } ?>
注意:如果PHP运行环境禁用了exec等系统函数,需要先在php.ini中把这些函数从disable_functions列表里移除。
方案2:HTTP协议传输(完全不需要ssh相关操作)
如果不想配置ssh相关内容,可以直接在被访问的局域网设备上部署一个极简的HTTP服务,通过HTTP的GET/POST请求实现文件上传下载,逻辑更直观,完全贴合PHP原生能力。
- 下载文件逻辑:目标设备上放一个可访问的PHP接口,直接输出对应文件的内容,本地PHP通过
file_get_contents()或者curl请求对应接口拿到文件内容保存即可,示例:
目标设备(192.168.1.100)上部署download.php:
本地PHP请求下载:<?php // 简单的权限校验,避免非局域网访问 if (substr($_SERVER['REMOTE_ADDR'], 0, 11) !== '192.168.1.') { die('非法访问'); } $file_path = './target_file.txt'; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($file_path).'"'); readfile($file_path); ?><?php $file_content = file_get_contents('http://192.168.1.100/download.php'); file_put_contents('./local_save.txt', $file_content); echo "下载完成"; ?> - 上传文件逻辑:目标设备部署接收上传的PHP接口,本地PHP通过curl发起文件上传请求即可,逻辑和普通Web表单上传完全一致。
方案3:SMB共享挂载(适合Windows设备为主的局域网)
如果局域网设备是Windows系统,或者已经开了SMB文件共享,可以直接把目标设备的共享目录挂载到PHP运行的设备上,PHP直接读写挂载后的目录就和操作本地文件完全一致,不需要额外写网络请求代码。
内容的提问来源于stack exchange,提问作者thebugbear
相关产品推荐
相关产品推荐

