Функция Python работает просто отлично, но не работает, когда для зацикленного - PullRequest
0 голосов
/ 28 сентября 2018

Итак, я создал эту функцию, которая изменяет пароль пользователя UNIX, и он работает просто отлично, но я хочу зациклить список пользователей, чтобы изменить пароль каждого пользователя.Но цикл for не работает в функции. Когда я назначаю переменную для того же пользователя в списке, она работает, но не в цикле

User.txt

FakeAccount
FakeUser

Функция Python

def change_password(username, new_password):
  process = pexpect.spawn("sudo passwd " + username)
  process.expect("Enter new UNIX password: ")
  process.sendline(new_password)
  process.expect("Retype new UNIX password: ")
  process.sendline(new_password)
  process.close()

Для цикла

np = "test"
f = open('User.txt', 'r')
for line in f:
    change_password(line.strip("\n\r"), np)
    print('done')
f.close()

Я пытаюсь выполнить цикл пофайл и поместите его на место для переменной username, когда я запускаю код, ошибок нет, однако, когда я пытаюсь войти в эти учетные записи, их пароли остаются прежними, когда я запускаю скрипт python, я являюсь пользователем root, чтобыне sudo пароли.

В чем проблема, из того, что я пробовал

Я думаю, что проблема в том, что где-то в процессе зацикливанияфайл, потому что, если я запускаю этот код, он отлично работает

import pexpect
def change_password(username, new_password):
  process = pexpect.spawn("sudo passwd " + username)
  process.expect("Enter new UNIX password: ")
  process.sendline(new_password)
  process.expect("Retype new UNIX password: ")
  process.sendline(new_password)
  process.close()

np = "test"
U = "FakeUser"

change_password(U, np)

Это только когда я ввожу это для цикла, когда я получаю проблему, и, насколько мне известно, он захватывает то же имя пользователя, что я набрал в моем примере теста, потому чточтобы проверить, что я попытался

f = open('User.txt', 'r')
for line in f:
    print("'" + line.strip("\n\r") + "'")

и получилрезультаты 'FakeAccount' и 'FakeUser', которые означают, что имена пользователей верны, возможно ли, что цикл for будет быстрым и не будет отправляться через терминал?или я что-то упустил?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Так что после многих разных тестов и изменения вещей теперь все работает идеально, проблема заключалась в том, что мне нужно было запустить его в python3, а также дать ему некоторое время для обработки команд, когда я поместил time.sleep (5)после этого функция запускается гладко.

0 голосов
/ 29 сентября 2018

На первый взгляд мне кажется, что проблема в открытии файла.Попробуйте с этим:

np = "test"
with open('User.txt', 'r', encoding='UTF-8') as f:
    lines = [l for l in f.read().split("\n") if l != ""]
    f.close()

for l in lines:
    change_password(l, np)
print('done')
...