Выполнение команд оболочки с использованием python In Linux - PullRequest
1 голос
/ 20 июня 2020

Так что я только недавно начал интересоваться и играть в CTF на веб-сайте OverTheWire, и я все еще участвую в первом испытании под названием бандит Lvl5, если вы рассмотрите его . Таким образом, он учит использовать linux командную строку и c

Итак, в этой задаче мне поручено, что в домашнем каталоге есть скрытые файлы, я должен их найти, и в одном из этих файлов я буду найдите пароль для go на следующий уровень, отметив, что появляется более 20 скрытых файлов.

Тогда я подумал, что нет, да, я могу go через это вручную, но это займет вечность, поэтому Я попытался создать сценарий, который, как мне казалось, будет работать, чтобы получить скрытые файлы и открывать их по одному. Но это работает не так, как я хотел.

Я хотел добавить эти скрытые файлы в список, а затем запустить для l oop, который откроет каждый из них, и тогда я смогу чтобы увидеть результаты и спот-пароль

Код ниже

import os

a = []
for i in os.system('find .inhere/'):
    a.append(i)
for j in a:
    print("\n\n cat j ")

Так что это мой первый раз такой ошибочный код, пытающийся взаимодействовать с в командной строке, используя python, не могли бы вы помочь, как я могу go об этом, или можно ли исправить мой код

1 Ответ

1 голос
/ 08 июля 2020

os.system() возвращает только статус выхода команды (не STDOUT). Вам следует использовать модуль subprocess, особенно subprocess.Popen. Я добавил несколько комментариев к своему коду для лучшего понимания.

Код:

import subprocess
import sys


def call_command(command):
    """
    Call a command the the STDOUT
    :param command: The related command
    :return: STDOUT as string
    """

    result1 = subprocess.Popen(
        command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True
    )

    #  Get the STDOUT and STDERR descriptors of the command.
    std_out, std_err = result1.communicate()

    return std_out


# Find files in test1 folder.
find_result = call_command("find test1/ -type f")
for one_find in find_result.split("\n"):
    if one_find:
        # The result of cat command will be in "cat_result" variable.
        cat_result = call_command("cat {}".format(one_find))
        print(cat_result)

        # You can write the result directly to STDOUT with the following line.
        # sys.stdout.write("\n".join(call_command("cat {}".format(one_find))))

Содержимое test1 папки:

>>> ll test1/
total 8
drwxrwxr-x  2 user grp 4096 Jul  8 14:18 ./
drwxrwxr-x 18 user grp 4096 Jul  8 14:33 ../
-rw-rw-r--  1 user grp 29 Jul  8 14:18 test_file.txt

Содержимое test_file.txt:

>>> cat test1/test_file.txt 
Contents of test_file.txt file

Вывод кода:

>>> python3 test.py
Contents of test_file.txt file.
...