Использование команды passwd из оболочки script
Я пишу оболочку script, чтобы автоматически добавлять нового пользователя и обновлять свой пароль. Я не знаю, как получить passwd для чтения из оболочки script вместо интерактивного запроса на новый пароль. Мой код ниже.
adduser $1
passwd $1
$2
$2
Ответы
Ответ 1
от "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
Ответ 2
Единственное решение работает на Ubuntu 12.04:
echo -e "new_password\nnew_password" | (passwd user)
Но второй вариант работает только при изменении:
echo "password:name" | chpasswd
To:
echo "user:password" | chpasswd
См. объяснения в исходном сообщении: Изменение пароля с помощью script
Ответ 3
Прочтите мудрые слова из:
Я цитирую:
Ничто, что вы можете сделать в 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
или таковую и красть пароль. Даже если вы считаете, что ваш ящик безопасен; это то, что вам нужно действительно получить привычку избегать любой ценой (да, даже затраты на выполнение немного больше проблем с выполнением работы).
Ответ 4
В настоящее время:
echo "user:pass" | chpasswd
Ответ 5
Протестировано это на изображении CentOS VMWare, которое я поддерживаю для такого рода вещей. Обратите внимание, что вы, вероятно, не хотите ставить пароли в качестве аргументов командной строки, потому что любой на всей машине может читать их из "ps -ef".
Тем не менее, это будет работать:
user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user
Ответ 6
Вы можете использовать chpasswd
echo $1:$2 | chpasswd
Ответ 7
Вы просмотрели опцию -p
adduser
(какой AFAIK - просто другое имя для useradd
)? Вы также можете посмотреть опцию -p
luseradd
, которая принимает пароль открытого текста, но я не знаю, является ли luseradd
стандартной командой (она может быть частью SE Linux или, возможно, просто странной Fedora).
Ответ 8
Вы можете использовать утилиту expect
для управления всеми программами, которые читаются из tty (в отличие от stdin, что и делает passwd). Expect поставляется с готовыми к запуску примерами для всех видов интерактивных задач, таких как запись passwd.
Ответ 9
Иногда полезно установить пароль, который никто не знает. Кажется, что это работает:
tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
Ответ 10
Я наткнулся на ту же проблему, и по какой-то причине опция "-stdin" не была доступна в версии passwd
, которую я использовал (отправлен на Ubuntu 14.04).
Если кто-то из вас экспериментирует, вы можете работать так же, как и я, используя команду chpasswd
следующим образом:
echo "<user>:<password>" | chpasswd
Ответ 11
Это окончательный ответ для teradata node admin
1: перейдите в файл /etc/hosts и создайте список имен IP или node в текстовом файле
------------------ конфигурационный файл для серверов начинается ------------
SMP007-1
SMP007-2
SMP007-3
------ конец файла оставить эти комментарии из файла cfg ---
теперь script
установить пароль для всех узлов
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
затем устанавливает пароль без какого-либо взаимодействия с пользователем или вторичный
проверка пароля. Теперь, сколько раз вы хотели сделать это
но не знал, как? С большой потребностью, приходит отличная инновация.
Подумайте, как полезно что-то вроде этого для администратора с сотнями
серверов.
Ответ 12
Для тех, кому нужно "запускать как 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