Использование команды passwd из сценария оболочки - PullRequest
56 голосов
/ 03 апреля 2009

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

adduser $1
passwd $1
$2
$2

Ответы [ 12 ]

82 голосов
/ 03 апреля 2009

из "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 вместо утилиты, как предлагает Эшоули .

Если вы используете оболочку, отличную от bash, «echo» может не быть встроенной командой, и оболочка вызовет /bin/echo. Это небезопасно, потому что пароль будет отображаться в таблице процессов и может быть виден с помощью инструментов, таких как ps.

В этом случае вам следует использовать другой язык сценариев. Вот пример в Perl:

#!/usr/bin/perl -w
open my $pipe, '|chpasswd' or die "can't open pipe: $!";
print {$pipe} "$username:$password";
close $pipe
47 голосов
/ 03 августа 2012

Единственное решение работает на Ubuntu 12.04:

echo -e "new_password\nnew_password" | (passwd user)

Но второй вариант работает только при изменении:

echo "password:name" | chpasswd

Кому:

echo "user:password" | chpasswd

См. Пояснения в оригинальном сообщении: Изменение пароля с помощью скрипта

25 голосов
/ 04 апреля 2009

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

Цитирую:

Ничто из того, что вы можете сделать в bash, может не сработать. passwd (1) не читает со стандартного ввода. Это намеренно. Это для вашей защиты. Пароли никогда не предназначались для введения в программы или генерирования программами. Они должны были быть введены только пальцами реального человека с функциональным мозгом и никогда и нигде не записываться.

Тем не менее, мы получаем множество пользователей, спрашивающих, как они могут обойти 35-летнюю безопасность Unix.

Далее объясняется, как правильно установить пароль shadow(5), и показан GNU- I-only-care-about-security-if-it-not-make-me- Подумайте слишком много - способ злоупотребления 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 или таким и украсть пароль. Даже если вы думаете, что ваша коробка безопасна; это то, что вы должны действительно привыкнуть избегать любой ценой (да, даже затратами на то, чтобы выполнить работу немного сложнее).

23 голосов
/ 02 ноября 2013

В наше время:

echo "user:pass" | chpasswd

1 голос
/ 05 мая 2017

Для тех, кому нужно «запускать от имени root» удаленно с помощью сценария, выполняющего вход в учетную запись пользователя в файле sudoers, я обнаружил злой ужасный хак, который, без сомнения, очень небезопасен:

sshpass -p 'userpass' ssh -T -p port user@server << EOSSH
sudo -S su - << RROOT
userpass
echo ""
echo "*** Got Root ***"
echo ""
#[root commands go here]
useradd -m newuser
echo "newuser:newpass" | chpasswd
RROOT
EOSSH
1 голос
/ 08 апреля 2013

Вы можете использовать chpasswd

echo $1:$2 | chpasswd

0 голосов
/ 03 июня 2016

Это окончательный ответ для администратора узла teradata.

Перейдите в файл /etc/hosts и создайте список IP-адресов или имен узлов в текстовом файле.

SMP007-1
SMP007-2
SMP007-3

Поместите в файл следующий скрипт.

#set a password across all nodes
printf "User ID: "
read MYUSERID
printf "New Password: "
read MYPASS

while read -r i; do
    echo changing password on "$i"
    ssh root@"$i" sudo echo "$MYUSERID":"$MYPASS" | chpasswd
    echo password changed on "$i"
done< /usr/bin/setpwd.srvrs

Хорошо, я знаю, что нарушил кардинальное правило безопасности с помощью ssh и root. но я позволю вам с этим справиться.

Теперь поместите это в подкаталог /usr/bin вместе с файлом конфигурации setpwd.srvrs.

Когда вы запускаете команду, она запрашивает один раз идентификатор пользователя затем один раз для пароля. Затем скрипт пересекает все узлы в файле setpwd.srvrs и делает ssh без пароля для каждого узла, затем устанавливает пароль без какого-либо вмешательства пользователя или вторичного проверка пароля.

0 голосов
/ 13 марта 2015

Я наткнулся на ту же проблему, и по какой-то причине опция «--stdin» была недоступна в используемой версии passwd (поставляется на Ubuntu 14.04).

Если кто-то из вас экспериментирует так же, вы можете обойти это, как я: с помощью команды chpasswd, подобной этой:

echo "<user>:<password>" | chpasswd

0 голосов
/ 07 июля 2014

Иногда полезно установить пароль, который никто не знает. Это похоже на работу:

tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
0 голосов
/ 02 июня 2012

Вы можете использовать утилиту expect для управления всеми программами, которые читают из tty (в отличие от stdin, что и делает passwd). Expect поставляется с готовыми для запуска примерами для всех видов интерактивных задач, таких как passwd entry.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...