ValueError: закрывающая кавычка отсутствует - оболочка slappasswd

Я использую getpass редактировать пароли LDAP просто и эффективно. Когда я использую пароль, например: c;_pr8\\E0L)ec*\'E._rPBH?"4i9Tne и попробуйте запустить программу, я получаю следующую ошибку:

Traceback (most recent call last):
  File "/usr/local/bin/editpasswd", line 73, in <module>
    main()
  File "/usr/local/bin/editpasswd", line 66, in main
    users_generated_password = generate_password()
  File "/usr/local/bin/editpasswd", line 52, in generate_password
    return send_command(PASSWORD_CREATION_COMMAND.format(users_password=password_to_generate))
  File "/usr/local/bin/editpasswd", line 33, in send_command
    command = shlex.split(command)
  File "/usr/lib/python2.7/shlex.py", line 279, in split
    return list(lex)
  File "/usr/lib/python2.7/shlex.py", line 269, in next
    token = self.get_token()
  File "/usr/lib/python2.7/shlex.py", line 96, in get_token
    raw = self.read_token()
  File "/usr/lib/python2.7/shlex.py", line 172, in read_token
    raise ValueError, "No closing quotation"
ValueError: No closing quotation

Как я вызываю пароль:

PASSWORD_CREATION_COMMAND = "slappasswd -s {users_password}"

def send_command(command):
    command = shlex.split(command)
    sender = subprocess.Popen(
        command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
    )
    res, err = sender.communicate()
    if res:
        return res.strip()
    if err:
        return err.strip()

def generate_password():
    password_to_generate = getpass.getpass(
        prompt="Enter the new password: "
    )
    confirm_password_to_generate = getpass.getpass(
        prompt="Confirm the password you just entered: "
    )
    if password_to_generate == confirm_password_to_generate:
        return send_command(PASSWORD_CREATION_COMMAND.format(users_password=password_to_generate))
    else:
        print("[!] password did not match")
        exit(-1)

Я думаю, что причиной этого является то, что когда команда запускается, пароль имеет " а также ' в нем, поэтому он терпит неудачу, потому что он пытается найти заключительную цитату. Как я могу получить о создании этой команды, чтобы принять ЛЮБОЙ пароль, который ей дан, содержит ли он 1 или 7 кавычек каждого вида?

IE я могу обернуть его в тройные кавычки без изменения пароля?

1 ответ

Разобрался с помощью комментариев. Проблема заключалась в том, что (как уже упоминалось) строк, закрывающих кавычки, там не было. Таким образом, если вы строите строку аргумента напрямую, а не используете shlex для ее разделения, она будет автоматически экранировать кавычки / косые черты. Например:

def build_list(string):
    return string.split(" ")

# build_list("""slappasswd -s c;_pr8\\E0L)ec*\'E._rPBH?"4i9Tne""")
#<= ['slappasswd', '-s', 'c;_pr8\\\\E0L)ec*\\\'E._rPBH?"4i9Tne']

После того, как все правильно экранировано, вы можете запустить его, и оно будет работать нормально.

Другие вопросы по тегам