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

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

Adduser $1
passwd $1
$2
$2

15 ответов

Решение

От "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

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

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

Но второй вариант работает только когда я изменяю с:

echo "password:name" | chpasswd

Для того, чтобы:

echo "user:password" | chpasswd

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

Настоящее время:

echo "user:pass" | chpasswd

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

Я цитирую:

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

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

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

Здесь-документ работает, если вашpasswd не поддерживает --stdin и вы не хотите (или не можете) использовать chpasswd по какой-то причине.

Пример:

#!/usr/bin/env bash

username="user"
password="pass"

passwd ${username} << EOD
${password}
${password}
EOD

Протестировано в Arch Linux. Этаpasswd является элементом shadow-utils и установлен из core/filesystem пакет, который у вас обычно есть по умолчанию, так как пакет требуется core/base.

Вы могли бы использовать chpasswd

echo $1:$2 | chpasswd

Для тех, кому нужно "запускать от имени 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

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

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

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

Это окончательный ответ для администратора узла 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 Subdir вместе с вашим setpwd.srvrs Конфигурационный файл

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

Для меня на Raspbian это работает только так (добавлен старый пароль):

      #!/usr/bin/env bash

username="pi"
password="Szevasz123"
new_ps="Szevasz1234"

passwd ${username} << EOD
${password}
${new_ps}
${new_ps}
EOD

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

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

user="$1"
password="$2"
adduser $user
echo $password | passwd --stdin $user

echo 'yourPassword' | sudo -S yourCommand

если -S не работает, попробуйте -kS

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

tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user

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

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

Другие вопросы по тегам