2017-06-02 3 views
1

Ich versuche, ein paar Befehle auf einem Amazon Linux 2016.09 c4.xlarge über das subprocess-Modul auszuführen.Amazon Linux-Instanz stirbt in Python-Skript mit subprocess.run

Ich kann chef oder andere CM tools nicht verwenden, weil ich die Befehle vor dem Ausführen des Skripts nicht kenne. Mein Skript analysiert einen XML-Bericht, der von einem CIS-Sicherheitstool ausgegeben wird.

Auf einem Fall nach folgenden Aussagen versucht, habe ich den Fehler:

executing command chown root:root /etc/cron.daily 
executing command iptables -P INPUT DROP 
executing command yum -y install aide 

# then crashes: terminal freezez and instance is inaccessible over port 22 

Bei einer anderen Studie der säumige yum Anruf

executing command chown root:root /etc/cron.daily 
executing command iptables -P INPUT DROP 
executing command yum -y remove xorg-x11* 
Loaded plugins: priorities, update-motd, upgrade-helper 
Resolving Dependencies 
--> Running transaction check 
---> Package xorg-x11-font-utils.x86_64 1:7.2-11.5.amzn1 will be erased 
---> Package xorg-x11-fonts-Type1.noarch 0:7.2-9.1.5.amzn1 will be erased 
--> Processing Dependency: xorg-x11-fonts-Type1 for package: 1:java-1.7.0-openjdk-1.7.0.131-2.6.9.0.71.amzn1.x86_64 
--> Running transaction check 
---> Package java-1.7.0-openjdk.x86_64 1:1.7.0.131-2.6.9.0.71.amzn1 will be erased 
--> Finished Dependency Resolution 

Dependencies Resolved 
# then crashes: terminal freezez and instance is inaccessible over port 22 

Das Skript selbst ist:

class CommandFix(object): 

    def _execute_command(self): 
     for command in self.commands: 
      command = command.replace('#', '') 
      command = command.replace('yum', 'yum -y') 

      print("executing command", command) 

      self.stdout_log.write("fixing {} : running command {}\n".format(
       self.rule_id, 
       command)) 

      try: 
       cp = subprocess.run(command, 
        shell=True, check=True 
        ) 
      except subprocess.CalledProcessError as e: 
       self.stderr_log.write("error fixing {} : {}\n".format(
        self.rule_id, 
        e)) 

       # TO-DO: Handle error with retry or similar 
       # right now just return false 
       return False 

     return True 

Antwort

0

Möglicherweise müssen Sie den Subprozess schließen.

Versuchen Sie unter Zeilen im Code hinzufügen -

import os 
process_execution_status = False 
try: 
    #your code 
    process_execution_status = True 
catch Exception as exc: 
    #exc handling 
    process_execution_status = False 
finally: 
    os.killpg(os.getpgid(cp.pid), signal.SIGTERM) 
    return process_execution_status 
+0

Ich denke, du hast Recht! Ich werde das jetzt versuchen und hier zurück melden –

+0

sicher, lass es mich wissen, wenn es geklappt hat! – tom

+0

Die Antwort starrte uns ins Gesicht! iptables! Ich blockte mich selbst aus –

0

Das Problem war, mit dem iptables Befehl. Es wurden alle eingehenden Verbindungen gelöscht. Die Instanz war in Ordnung, nur von iptables blockiert