Laravel 9 SFTP无法写入文件求助:text.txt写入失败
你使用Storage::disk('backup')->put('text.txt', 'My Text')尝试写入SFTP服务器时遇到League\Flysystem\UnableToWriteFile错误,且已确认目录权限正常,以下是几个常见的排查和解决方向:
指定SFTP根目录
默认情况下,Flysystem的SFTP驱动会将用户的home目录作为根路径。如果目标写入路径不在这个默认根目录范围内,需要在backup磁盘配置中显式指定root参数:'backup' => [ 'driver' => 'sftp', 'host' => env('SFTP_HOST'), 'username' => env('SFTP_USERNAME'), 'password' => env('SFTP_PASSWORD'), 'root' => '/path/to/your/target/directory', // 替换为实际服务器目录路径 'throw' => true, ],手动验证SFTP连接权限
用命令行SFTP客户端直接连接服务器,手动尝试创建文件,排除代码层面的问题:sftp your_username@your_sftp_host # 连接成功后执行 touch text.txt echo "My Text" > text.txt如果手动操作也失败,说明服务器端存在权限或配置限制,需联系管理员排查;如果手动成功,再回到代码层面调试。
开启被动模式
部分SFTP服务器要求使用被动模式才能写入,可在配置中添加passive参数:'backup' => [ // ... 其他配置 'passive' => true, 'throw' => true, ],检查服务器安全模块限制
若SFTP服务器是Linux系统,SELinux或AppArmor可能会拦截写入操作,即使目录权限正确。可以临时关闭SELinux测试(生产环境需谨慎):sudo setenforce 0如果关闭后能正常写入,需要给SFTP目录添加SELinux规则:
sudo semanage fcontext -a -t public_content_rw_t "/path/to/your/directory(/.*)?" sudo restorecon -Rv /path/to/your/directory确认SFTP端口配置
如果服务器未使用默认的22端口,需在配置中添加port参数:'backup' => [ // ... 其他配置 'port' => env('SFTP_PORT', 22), // 替换为实际端口 'throw' => true, ],启用调试日志
开启Flysystem的调试模式,获取更详细的错误信息。在Laravel中可以通过配置添加debug参数:'backup' => [ // ... 其他配置 'debug' => true, 'throw' => true, ],之后查看Laravel日志(
storage/logs/laravel.log),里面会包含SFTP交互的详细过程,有助于定位具体问题。
内容的提问来源于stack exchange,提问作者rabbit

