Я пишу оболочку script, чтобы автоматически добавлять нового пользователя и обновлять свой пароль. Я не знаю, как получить passwd для чтения из оболочки script вместо интерактивного запроса на новый пароль. Мой код ниже.
adduser $1 passwd $1 $2 $2
Я пишу оболочку script, чтобы автоматически добавлять нового пользователя и обновлять свой пароль. Я не знаю, как получить passwd для чтения из оболочки script вместо интерактивного запроса на новый пароль. Мой код ниже.
adduser $1 passwd $1 $2 $2
от "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
может не иметь опции --stdin
: используйте chpasswd
вместо этого, как предложено ashawley.
Если вы используете оболочку, отличную от bash, "эхо" может не быть встроенной командой,
и оболочка вызовет /bin/echo
. Это небезопасно, потому что пароль
будет отображаться в таблице процессов и можно увидеть с помощью таких инструментов, как ps
.
В этом случае вы должны использовать другой язык сценариев. Вот пример в Perl:
#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
Единственное решение работает на Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
Но второй вариант работает только при изменении:
echo "password:name" | chpasswd
To:
echo "user:password" | chpasswd
См. объяснения в исходном сообщении: Изменение пароля с помощью script
Прочтите мудрые слова из:
Я цитирую:
Ничто, что вы можете сделать в bash, не может работать. passwd (1) не читается со стандартного ввода. Это намеренно. Это для вашей защиты. Пароли никогда не предназначались для включения в программы или генерировались программами. Они предназначались для ввода только пальцами реального человека, с функциональным мозгом и никогда нигде не записывались.
Тем не менее, мы получаем орды пользователей, которые спрашивают, как они могут обойти 35-летнюю безопасность Unix.
Далее объясняется, как вы можете правильно установить свой пароль shadow(5)
, и покажет вам, что GNU-I-only-care-about-security-if-it-doesn't-make-me-think-too -макс злоупотребления 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
или таковую и красть пароль. Даже если вы считаете, что ваш ящик безопасен; это то, что вам нужно действительно получить привычку избегать любой ценой (да, даже затраты на выполнение немного больше проблем с выполнением работы).
В настоящее время:
echo "user:pass" | chpasswd
Протестировано это на изображении CentOS VMWare, которое я поддерживаю для такого рода вещей. Обратите внимание, что вы, вероятно, не хотите ставить пароли в качестве аргументов командной строки, потому что любой на всей машине может читать их из "ps -ef".
Тем не менее, это будет работать:
user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user
Вы можете использовать chpasswd
echo $1:$2 | chpasswd
Вы просмотрели опцию -p
adduser
(какой AFAIK - просто другое имя для useradd
)? Вы также можете посмотреть опцию -p
luseradd
, которая принимает пароль открытого текста, но я не знаю, является ли luseradd
стандартной командой (она может быть частью SE Linux или, возможно, просто странной Fedora).
Вы можете использовать утилиту expect
для управления всеми программами, которые читаются из tty (в отличие от stdin, что и делает passwd). Expect поставляется с готовыми к запуску примерами для всех видов интерактивных задач, таких как запись passwd.
Иногда полезно установить пароль, который никто не знает. Кажется, что это работает:
tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
Я наткнулся на ту же проблему, и по какой-то причине опция "-stdin" не была доступна в версии passwd
, которую я использовал (отправлен на Ubuntu 14.04).
Если кто-то из вас экспериментирует, вы можете работать так же, как и я, используя команду chpasswd
следующим образом:
echo "<user>:<password>" | chpasswd
Это окончательный ответ для teradata node admin
1: перейдите в файл /etc/hosts и создайте список имен IP или node в текстовом файле
------------------ конфигурационный файл для серверов начинается ------------
SMP007-1
SMP007-2
SMP007-3
------ конец файла оставить эти комментарии из файла cfg ---
printf "Идентификатор пользователя:"
прочитайте MYUSERID
printf "Новый пароль:"
прочитайте MYPASS
для я в `
cat/usr/bin/setpwd.srvrs `
сделать
echo change password on $i
ssh root @$i sudo echo "$ MYUSERID": "$ MYPASS" | chpasswd
echo password изменен на $i
Молодцы
ОК Я знаю, что нарушил кардинальное правило безопасности с ssh и root но я позволю вам с ними справиться с безопасностью.
_________________________________
поместите это в ваш /usr/bin subdir вместе с конфигурационным файлом setpwd.srvrs
когда вы запускаете команду, она запрашивает у вас один раз для идентификатора пользователя
затем один раз для пароля. Затем script пересекает все узлы
в файле setpwd.srvrs делает ssh без пароля ssh для каждого node
затем устанавливает пароль без какого-либо взаимодействия с пользователем или вторичный
проверка пароля. Теперь, сколько раз вы хотели сделать это
но не знал, как? С большой потребностью, приходит отличная инновация.
Подумайте, как полезно что-то вроде этого для администратора с сотнями
серверов.
Для тех, кому нужно "запускать как root" удаленно через script, регистрируясь в учетной записи пользователя в файле sudoers, я нашел злой ужасный хак, который, без сомнения, очень небезопасен:
sshpass -p 'userpass' ssh -T -p port [email protected] << EOSSH
sudo -S su - << RROOT
userpass
echo ""
echo "*** Got Root ***"
echo ""
#[root commands go here]
useradd -m newuser
echo "newuser:newpass" | chpasswd
RROOT
EOSSH