从Python运行的bash脚本达到sudo超时



这是一个长bash脚本(400多行(,最初是从类似so-的django应用程序中调用的

os.system('./bash_script.sh &> bash_log.log')

它在脚本中的一个随机命令上停止。如果命令的顺序发生更改,它将挂在大致相同位置的另一个命令上。

ssh连接到运行django应用程序的机器,并运行sudo ./bash_script.sh,请求密码,然后一直运行。

当它挂在日志文件中时,我看不到它显示的消息,无法使它重定向到那里。我想这是一个sudo密码请求。

尝试-

脚本中的
  • sudo -v没有帮助
  • ssh到机器,并在/etc/sudoers中手动延长sudo超时-没有帮助,我认为因为django应用程序已经在运行,并且使用了previos超时
  • 将脚本一分为二,并在单独的线程中运行一个,就像这样-
def basher(command, log_path):
with open(log_path) as log:
Popen(command, stdout=log, stderr=log).wait()
script_thread = Thread(target=basher, args=('bash_script_pt1.sh', 'bash_log_pt1.log'))
script_thread.start()
os.system('./bash_script_pt2.sh &> bash_log_pt2.log') # I know it's deprecated, not sure if maybe it's better in this case
script_thread.join()

日志显示,第1部分结束得很好,但第2部分仍然挂起,尽管在代码中的时间比它们在一起时晚。

我想从Python代码内部编辑/etc/sudoers,然后通过su - user重新登录。这里有一些关于如何使用pty传递密码的片段,但我不了解它的机制,也无法使它发挥作用。

我还注意到ps aux | grep bash_script.sh显示脚本正在运行两次。As-

/bin/bash bash_script.sh

作为

CCD_ 11。

我假设os.system有一个内部shell=True正在进行

我不了解Linux实体/机制,无法弄清楚发生了什么。

我的猜测是,django应用程序与脚本本身具有不同且更有限的权限,并且脚本继承了所述限制,因为它正在执行。

当你从bash运行脚本时,你需要弄清楚它有什么权限,当你通过django运行脚本时它有什么,然后找出区别。

最新更新