Использование команды 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
См. Объяснения в оригинальном сообщении: Смена пароля с помощью скрипта
Прочитайте мудрые слова из:
Я цитирую:
Ничто из того, что вы можете сделать в 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
.
Для тех, кому нужно "запускать от имени 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.