Используя passwd управляют из сценария оболочки

Я пишу сценарий оболочки, чтобы автоматически добавить нового пользователя и обновить их пароль. Я не знаю, как заставить passwd читать из сценария оболочки вместо того, чтобы в интерактивном режиме предложить мне новый пароль. Мой код ниже.

adduser $1
passwd $1
$2
$2
59
задан codeforester 17 February 2017 в 06:07
поделиться

4 ответа

от"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
85
ответ дан Community 24 November 2019 в 18:01
поделиться

Вы посмотрели на -p опция adduser (которого AFAIK является просто другим названием useradd)? Можно также хотеть посмотреть на -P опция luseradd который берет незашифрованный пароль, но я не знаю если luseradd стандартная команда (это может быть часть Linux SE или возможно просто причуды Fedora).

0
ответ дан rmeador 24 November 2019 в 18:01
поделиться

Считайте мудрые слова из:

Я заключаю в кавычки:

Ничто, что можно сделать в ударе, не может возможно работать. 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 или такой и кража пароль. Даже если Вы думаете, что Ваше поле безопасно; это - что-то, чего необходимо действительно привыкнуть избегать по всей стоимости (да, даже стоимость выполнения немного большей проблемы, получив сделанное задание).

26
ответ дан lhunath 24 November 2019 в 18:01
поделиться

Протестированный это на изображении CentOS VMWare, которое я имею в наличии для этого вида вещи. Обратите внимание, что Вы, вероятно, не хотите помещать пароли как параметры командной строки, потому что кто-либо на всей машине может считать их из 'PS-ef'.

Тем не менее это будет работать:

user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user
0
ответ дан Don Werve 24 November 2019 в 18:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: