Я использую этот код для открытия оболочки 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 обрабатывает его.
Примечание: извините за языковые ошибки. Мой родной язык не английский