代码之家  ›  专栏  ›  技术社区  ›  Jay

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

  •  0
  • Jay  · 技术社区  · 4 年前

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

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

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

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

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

    尝试

    • sudo -v 在脚本中-没有帮助。
    • ssh 到机器,并在中手动延长sudo超时 /etc/sudoers -没有帮助,我想因为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部分仍然挂起,尽管在代码中的时间比它们在一起时晚。

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

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

    /bin/bash bash_script.sh

    作为

    sh -c bash_script.sh .

    我想 os.system 有一个内部 shell=True 继续。

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

    1 回复  |  直到 4 年前
        1
  •  0
  •   petrus4    4 年前

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

    您需要弄清楚当您仅从bash运行脚本时,脚本具有哪些权限,以及当您通过django运行脚本时它具有什么权限,然后找出区别。

    推荐文章