Отправка сигналов процессам, открытым bash python pty (pty.openpty и subprocess.Popen) - PullRequest
0 голосов
/ 12 сентября 2018

Я использую этот код для открытия оболочки linux и отправки ей команд из скрипта python:

#!/usr/bin/env python

import sys,subprocess,pty,os,time,threading
#This script is for Linux
result=""


def SendCommand(master,cmd):#function to send a command to opened shell process
 os.write(master, cmd+"\n")

def ReadMasterTo(master):#function to read output of shell and append it to result
 global result
 while(True):
  result+=os.read(master,2048)

def Signal(pid,signalnum):#function to send Signals to a process pid,It is what CTRL+C and ... do.
 os.killpg(pid,signalnum)


master, slave = pty.openpty() # I need pty to be able to execute some commands like sudo


SHELL = ["/bin/sh","-i"]#If I use /bin/sh signalling works,but I don't have tty!
                          #If I use /bin/bash I have tty but signalling doesn't work!
                          # want both of signalling and tty!

shell = subprocess.Popen(SHELL,preexec_fn=os.setsid,stdin=slave,stdout=slave,stderr=slave,universal_newlines=True)

time.sleep(1)#sleep 1 sec for being sure shell is open


t1 = threading.Thread(target=ReadMasterTo,args=(master,))#Call ReadMasterTo() as a thread to read output of shell and append it to result
t1.daemon=True
t1.start()

print "Started!Waiting..."

print "Ping 127.0.0.1 started."

SendCommand(master,"ping 127.0.0.1")
time.sleep(5)
Signal(shell.pid,2)

print "Ping 127.0.0.1 finished."
print "Ping google.com started."

SendCommand(master,"ping google.com")
time.sleep(5)
Signal(shell.pid,2)


print "Ping operations finished."
SendCommand(master,"echo 1 > ./done")


f=open("result.txt","w")
f.write(result)
f.close()

print "Result was saved to result.txt!\n"
os.system("cat ./result.txt")
print "\nExit"
os._exit

Основная проблема здесь: SHELL = ["/ bin / sh", "- i"] # Если я использую / bin / sh, сигнализация работает, но у меня нет tty! # Если я использую / bin / bash, у меня есть tty, но сигнализация не работает! # хочу как сигнализации, так и tty!

Если я использую / bin / bash, функция сигнала не завершает процесс проверки связи Если я использую / bin / sh, функция сигнала работает, но я получаю эту ошибку:

/bin/sh: 0: can't access tty; job control turned off

означает, что я не могу использовать tty based-команды, такие как sudo, ...

Этот скрипт на python не запускается из Terminal, он вызывается из программы на C. Он сохраняет результат в файл, а программа на C обрабатывает его.

Примечание: извините за языковые ошибки. Мой родной язык не английский

...