我正在 Flask 中编写一个辅助应用程序来自动执行服务器上的操作。
我遇到了一个非常令人困惑的问题,我想询问这是否是我使用 Python 子进程的人为因素,或者是否是 Flask 造成的。
当我运行子进程调用以在运行 Flask 应用程序的计算机上安装远程 cifs 共享时,我看到了一些相当奇怪的东西。从 Flask 应用程序的角度来看,共享已挂载,文件可见,并且应用程序可以将文件交互(上传)到远程服务器。
我无法解释的是,这个挂载显然只对运行 Flask 的线程可见。如果我通过 SSH 连接到运行 Flask 的计算机,并在命令行中使用“mount -t cifs”列出目录(或使用 SFTP 连接从我的 PC 文件管理器)请求挂载,则挂载目录为空,并且共享为未报告为已安装。
在提示符处手动运行与 Flask 发出的命令相同的命令会按预期挂载共享。
我尝试使用子进程库中的 Popen 和 run 方法,但结果是相同的,就好像 Flask 应用程序具有独立于操作系统的虚拟文件系统,除了在挂载之前发出的命令是mkdir 在 /mnt/remote 下创建挂载点目录。该命令也会传播到操作系统,并且当我 ls /mnt/remote 目录时会列出新目录。
我还尝试过在有和没有 shell=True 的情况下运行 Popen 调用,这两种方法都在 Flash 线程内工作,否则都没有使挂载可见。
代码片段如下:
`
def run_system_command_shell( cmd ):
result = subprocess.Popen( cmd, shell=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
std_out, std_err = result.communicate()
rtn_code = result.returncode
return std_out, std_err, rtn_code
def mount_remote( share_data ):
cred_file = share_data['cred_file']
cmd = 'sudo mount '
cmd = cmd + '-t ' + share_data['share_type'] + ' '
cmd = cmd + '-o credentials=' + cred_file
cmd = cmd + ' ' + share_data['share'] + ' ' + share_data['mnt_point']
std_out, std_err, rtn_code = run_system_command_shell( [cmd] )
if rtn_code != 0:
current_app.logger.warning("Could not mount {}. Error: {}".format( share_data['share'], std_out ))
return False, std_out
else:
current_app.logger.info("Mounted {}.".format( share_data['share'] ))
return True, std_out
`
结果cmd:'sudo mount -t cifs -o凭据=/var/www/ui/config/credentials/10.0.10.10 //10.0.10.10/Install /mnt/remote/10.0.10.10_Install' `
如果这个应用程序要工作,它需要在整个系统上安装远程共享。还有其他人遇到过这个问题吗?有办法解决吗? 谢谢,阿
你的烧瓶运行得怎么样?根据您的描述,我敢打赌您正在使用 Docker 在容器中运行它。
然后,您所描述的实际上是预期的 - 即使容器指向“真实”文件系统中的挂载点,挂载也仅存在于容器内部。
只需重新配置您的应用程序以在容器外运行。