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']
После того, как все правильно экранировано, вы можете запустить его, и оно будет работать нормально.