Селен быстрее, чем веб-страница. Поэтому он пытается найти элемент (текстовое поле пароля) до его загрузки. поэтому в коде выбрасывается элемент not found исключение. Вы можете использовать Thread.sleep(2000)
или внешнее ожидание.
от"man 1 passwd
":
--stdin
This option is used to indicate that passwd should read the new
password from standard input, which can be a pipe.
Таким образом в Вашем случае
adduser "$1"
echo "$2" | passwd "$1" --stdin
[Обновление] несколько проблем было поднято в комментариях:
Ваш passwd
команда не может иметь a --stdin
опция: используйте chpasswd
утилита вместо этого, как предложено ashawley.
При использовании оболочки кроме удара "эхо" не могло бы быть встроенной командой, и оболочка будет звонить /bin/echo
. Это небезопасно, потому что пароль обнаружится в таблице процессов и виден с инструментами как ps
.
В этом случае необходимо использовать другой язык сценариев. Вот пример в Perl:
#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
Вы посмотрели на -p
опция adduser
(которого AFAIK является просто другим названием useradd
)? Можно также хотеть посмотреть на -P
опция luseradd
который берет незашифрованный пароль, но я не знаю если luseradd
стандартная команда (это может быть часть Linux SE или возможно просто причуды Fedora).
Считайте мудрые слова из:
Я заключаю в кавычки:
Ничто, что можно сделать в ударе, не может возможно работать. passwd (1) не читает из входа стандарта. Это является намеренным. Это для Вашей защиты. Пароли никогда не предназначались, чтобы быть помещенными в программы или сгенерированными программами. Они были предназначены, чтобы быть введенными только пальцами фактического человека с функциональным мозгом, и никогда не записываться нигде.
Тем не менее, мы получаем орды пользователей, спрашивающих, как они могут обойти 35 лет безопасности Unix.
Это продолжает объяснять, как можно установить Ваш shadow(5)
пароль правильно и шоу Вы GNU-I-only-care-about-security-if-it-doesn't-make-me-think-too-much-way злоупотребления passwd(1)
.
Наконец, если Вы собираетесь использовать глупый GNU passwd (1) расширение --stdin
, не передавайте пароль, помещая его на командную строку.
echo $mypassword | passwd --stdin # Eternal Sin.
echo "$mypassword" | passwd --stdin # Eternal Sin, but at least you remembered to quote your PE.
passwd --stdin <<< "$mypassword" # A little less insecure, still pretty insecure, though.
passwd --stdin < "passwordfile" # With a password file that was created with a secure `umask(1)`, a little bit secure.
Последнее является лучшим, можно сделать с GNU passwd
. Хотя я все еще не рекомендовал бы это.
Помещение пароля на командной строке означает, что любой даже с самой удаленной подсказкой доступа к полю может контролировать ps
или такой и кража пароль. Даже если Вы думаете, что Ваше поле безопасно; это - что-то, чего необходимо действительно привыкнуть избегать по всей стоимости (да, даже стоимость выполнения немного большей проблемы, получив сделанное задание).
Протестированный это на изображении CentOS VMWare, которое я имею в наличии для этого вида вещи. Обратите внимание, что Вы, вероятно, не хотите помещать пароли как параметры командной строки, потому что кто-либо на всей машине может считать их из 'PS-ef'.
Тем не менее это будет работать:
user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user