这是一个长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运行脚本时它有什么,然后找出区别。