Подтвердить что ты не робот

Использование команды passwd из оболочки script

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

adduser $1
passwd $1
$2
$2
4b9b3361

Ответ 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