gridea icon indicating copy to clipboard operation
gridea copied to clipboard

关于宝塔环境下无法使用sftp发布的原因及解决方案

Open waynechen opened this issue 2 years ago • 2 comments

在宝塔环境下,通过sftp发布时遇到报错无法同步。在Issues中看到有几个都是遇到同样问题,我来简单说一下原因及解决方案。

在宝塔环境下,宝塔系统会生成一个 .user.ini 文件,这个文件有权限限制不能直接用rm删除,并且也不建议删除。重点就在于这个文件。

我们看下gridea项目里面 src/server/plugins/deploys/sftp.ts 这个文件,第118行119行:

await client.exec(`rm -rf ${remotePath}`)
await client.mkdir(remotePath)

这里会先删除掉网站根目录,然后再创建网站根目录。这时因为有 .user.ini 这个受限文件存在,根目录是删不掉的。所以就会导致 sftp 无法发布的问题产生。并且gridea中会报错:

rm: cannot remove '/www/wwwroot/xxxxx.com/gridea/.user.ini': Operation not permitted

既然定位到问题,解决方案就很好办了,建议将 src/server/plugins/deploys/sftp.ts 这个文件里118行改成这样,119行删掉:

await client.exec(`rm -rf ${remotePath}/*`)

直接删除网站根目录下所有文件就好,并不需要删除网站根目录再重建。(我没想通删除目录再重建这种操作的目的是为何)

waynechen avatar Jul 15 '23 13:07 waynechen

嗯,我也遇到了这个问题,我的做法是直接把.user.ini给删掉,目前没有影响

mxdabc avatar Jul 31 '23 03:07 mxdabc

嗯,我也遇到了这个问题,我的做法是直接把.user.ini给删掉,目前没有影响

是的,删除 .user.ini 文件确实可以,但是 .user.ini的目的是防止跨目录访问和文件跨目录读取,处于安全性考虑也不建议删除 .user.ini。况且,就算是一时删除了 .user.ini 文件,只要在宝塔后台对网站进行配置操作,宝塔发现 .user.ini 文件丢了也会重新生成的。

所以,这个问题的根本原因,其实还是因为 gridea 在同步文件的时候采取的是先删除目录再重建的方式,这是完全没必要的。

waynechen avatar Jul 31 '23 06:07 waynechen