Example #1
0
    async def exec_powershell_script_from_file(self, hosts, shell_type,
                                               local_file_name, username,
                                               password, transport,
                                               server_cert_validation,
                                               message_encryption):
        """
        Execute a list of remote commands on a list of hosts.
        :param hosts: List of host ips to run command on
        :param shell_type: The type of shell you wish to run (i.e. "powershell")
        :param local_file_name: file name to run specified script from
        :param username: username of the machine you wish to run command on
        :param password: password for the machine you wish to run command on
        :param transport: method of transportation
        :param server_cert_validation: whether or not to verify certificates
        :param message_encryption: When you should encrypt messages

        :return: dict of results with hosts as keys and list of outputs for each specified hosts
        """
        results = {}
        curr_dir = os.getcwd()
        temp_dir = os.path.join(curr_dir, r'scripts')
        os.chdir(temp_dir)
        curr_dir = os.getcwd()
        local_file_path = os.path.join(curr_dir, local_file_name)

        for host in hosts:
            self.logger.info(f"Executing on {host}")
            results[host] = ""

            try:
                wsman = WSMan(host,
                              ssl=server_cert_validation,
                              auth=transport,
                              encryption=message_encryption,
                              username=username,
                              password=password)

                with WinRS(wsman) as shell:
                    # for command in commands:
                    script = open(local_file_path, "r").read()

                    process = Process(shell, shell_type, script)
                    process.begin_invoke(
                    )  # start the invocation and return immediately
                    process.poll_invoke()  # update the output stream
                    process.end_invoke(
                    )  # finally wait until the process is finished
                    results[host] = {
                        "stdout": process.stdout.decode(),
                        "stderr": process.stderr.decode()
                    }
                    process.signal(SignalCode.CTRL_C)

            except Exception as e:
                results[host] = {"stdout": "", "stderr": f"{e}"}

        return results
Example #2
0
    async def exec_powershell_script(self, hosts, shell_type, arguments,
                                     username, password, transport,
                                     server_cert_validation,
                                     message_encryption):
        """
        Execute a list of remote commands on a list of hosts.
        :param hosts: List of host ips to run command on
        :param shell_type: The type of shell you wish to run (i.e. "powershell")
        :param commands: array of commands in which you want to run on every host
        :param username: username of the machine you wish to run command on
        :param password: password for the machine you wish to run command on
        :param transport: method of transportation
        :param server_cert_validation: whether or not to verify certificates
        :param message_encryption: When you should encrypt messages

        :return: dict of results with hosts as keys and list of outputs for each specified hosts
        """
        results = {}

        for host in hosts:
            self.logger.info(f"Executing on {host}")
            results[host] = ""

            try:
                wsman = WSMan(host,
                              ssl=server_cert_validation,
                              auth=transport,
                              encryption=message_encryption,
                              username=username,
                              password=password)

                with WinRS(wsman) as shell:
                    for arg in arguments:
                        process = Process(shell, shell_type, [arg])
                        process.begin_invoke(
                        )  # start the invocation and return immediately
                        process.poll_invoke()  # update the output stream
                        process.end_invoke(
                        )  # finally wait until the process is finished
                        results[host] = {
                            "stdout": process.stdout.decode(),
                            "stderr": process.stderr.decode()
                        }
                        process.signal(SignalCode.CTRL_C)

            except Exception as e:
                results[host] = {"stdout": "", "stderr": f"{e}"}

        return results
Example #3
0
    async def exec_command_prompt(self, hosts, commands, username, password, transport, server_cert_validation,
                                  message_encryption):
        """
        Execute a list of remote commands on a list of hosts.
        :param hosts: List of host ips to run command on
        :param commands: array of commands in which you want to run on every host
        :param username: username of the machine you wish to run command on
        :param password: password for the machine you wish to run command on
        :param transport: method of transportation
        :param server_cert_validation: whether or not to verify certificates
        :param message_encryption: When you should encrypt messages

        :return: dict of results with hosts as keys and list of outputs for each specified hosts
        """

        results = {}

        for host in hosts:
            results[host] = ""
            try:
                wsman = WSMan(host, ssl=server_cert_validation, auth=transport, encryption=message_encryption,
                              username=username, password=password)

                with WinRS(wsman) as shell:
                    for command in commands:
                        process = Process(shell, command)
                        process.invoke()
                        results[host] = {"stdout": process.stdout.decode(), "stderr": process.stderr.decode()}
                        process.signal(SignalCode.CTRL_C)

            except Exception as e:
                results[host] = {"stdout": "", "stderr": f"{e}"}

        return results
Example #4
0
    async def exec_command_prompt_from_file(self, hosts, local_file_name,
                                            username, password, transport,
                                            server_cert_validation,
                                            message_encryption):
        """
        Execute a list of remote commands on a list of hosts.
        :param hosts: List of host ips to run command on
        :param local_file_name: file name to run specified script from
        :param username: username of the machine you wish to run command on
        :param password: password for the machine you wish to run command on
        :param transport: method of transportation
        :param server_cert_validation: whether or not to verify certificates
        :param message_encryption: When you should encrypt messages

        :return: dict of results with hosts as keys and list of outputs for each specified hosts
        """

        results = {}

        for host in hosts:
            results[host] = ""
            try:
                wsman = WSMan(host,
                              ssl=server_cert_validation,
                              auth=transport,
                              encryption=message_encryption,
                              username=username,
                              password=password)

                with WinRS(wsman) as shell:
                    with open(local_file_name, "r") as f:
                        script = f.read()
                    process = Process(shell, script)
                    process.invoke()
                    results[host] = {
                        "stdout": process.stdout.decode(),
                        "stderr": process.stderr.decode()
                    }
                    process.signal(SignalCode.CTRL_C)

                    self.logger.info(f"Done executing on {host}")
            except Exception as e:
                results[host] = {"stdout": "", "stderr": f"{e}"}

        return results
Example #5
0
    async def exec_powershell_script_dependencies(self, hosts, shell_type,
                                                  arguments, dependency_folder,
                                                  destination_folder, username,
                                                  password, transport,
                                                  server_cert_validation,
                                                  message_encryption):
        """
        Execute a list of remote commands on a list of hosts.
        :param hosts: List of host ips to run command on
        :param shell_type: The type of shell you wish to run (i.e. "powershell")
        :param commands: array of commands in which you want to run on every host
        :param dependency_folder: Specifies the local folder to copy
        :param destination_folder: Specifies the destination folder to copy and delete
        :param username: username of the machine you wish to run command on
        :param password: password for the machine you wish to run command on
        :param transport: method of transportation
        :param server_cert_validation: whether or not to verify certificates
        :param message_encryption: When you should encrypt messages

        :return: dict of results with hosts as keys and list of outputs for each specified hosts
        """
        results = {}

        for host in hosts:
            self.logger.info(f"Connecting to {host}")
            results[host] = []

            try:
                wsman = WSMan(host,
                              ssl=server_cert_validation,
                              auth=transport,
                              encryption=message_encryption,
                              username=username,
                              password=password)
                client = Client(host,
                                ssl=server_cert_validation,
                                auth=transport,
                                encryption=message_encryption,
                                username=username,
                                password=password)

                self.logger.info(f"Copying to {host}")
                for root, dirs, files in os.walk(dependency_folder):
                    root_folder = destination_folder + "\\" + os.path.basename(
                        root)
                    output, streams, had_errors = client.execute_ps('''
                        $path = "%s"

                        if(!(Test-Path -Path $path )){
                            New-Item -ItemType directory -Path $path
                            Write-Host "New folder created"
                        }''' % root_folder)

                    results[host].append({
                        "stdout": output,
                        "had_errors": had_errors
                    })
                    for file in files:
                        client.copy(os.path.join(root, file),
                                    root_folder + "\\" + file)

                self.logger.info(f"Executing on {host}")

                # execute scripts
                with WinRS(wsman) as shell:
                    #Changes directory to dependency root and appends folder removal to end
                    arguments = f"cd {destination_folder};" + '; '.join(
                        arguments)
                    self.logger.info(f"{arguments}")
                    process = Process(shell, shell_type, [arguments])
                    process.invoke()
                    results[host].append({
                        "stdout": process.stdout.decode(),
                        "stderr": process.stderr.decode()
                    })

                    arguments = f"Remove-Item -Recurse {destination_folder}"
                    self.logger.info(f"Removing from {host}")
                    process = Process(shell, shell_type, [arguments])
                    process.invoke()
                    process.signal(SignalCode.CTRL_C)

            except Exception as e:
                import traceback
                tb = traceback.format_exc()
                results[host].append({
                    "stdout": "",
                    "stderr": f"{e}",
                    "exception": f"{tb}"
                })

        return results