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

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

03.04.2009 09:34:53 Просмотров 44 Источник

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

adduser $1
passwd $1
$2
$2
У вопроса есть решение - Посмотреть?

Ответы - Использование команды passwd из сценария оболочки / Using the passwd command from within a shell script

Является ответом!
8jean

03.04.2009 09:41:35

от "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: используйте --stdin полезность вместо этого, как предложил ашоули .

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

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

ps
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/714934#comment527769_714934
Вы должны цитировать свои расширения параметров. Более того, это никоим образом не форма или форма переносимы или даже рекомендуется в малейшей степени. Смотрите мой ответ для получения дополнительной информации по этой теме.
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/714934#comment527802_714934
Пожалуйста, не используйте Эхо ... - пароль! Пароль будет виден всем другим пользователям, которые запускают ps. И чем больше мест вы передаете пароль (различные программы, файлы, каналы и т. д.), тем выше вероятность того, что он где-то просочится.
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/714934#comment528718_714934
@lhunath: вы правы насчет цитирования, я это исправлю. @Brian: "echo" - это bash builtin, он не будет отображаться в выводе " ps " (По крайней мере, в bash, не уверен насчет sh)
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/714934#comment5398190_714934
если bash, то passwd "$1" <<< "$2"
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/714934#comment44128834_714934
@glennjackman обратите внимание, что здесь строки неявно создают временные файлы, которые могут быть прочитаны внешними источниками.
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/714934#comment44128959_714934
@ 8jean полагаться на то, что echo держит свои аргументы вне дерева публичных процессов, как побочный эффект его встроенности, вероятно, не лучшая практика. Побочный эффект может не иметь места во всех системах, echo не всегда является встроенным, и видеть пароли, передаваемые в качестве аргументов, должно быть просто большим красным флагом, которого вы должны стремиться избегать.
rmeador

03.04.2009 09:43:33

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

Don Werve

03.04.2009 09:49:38

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

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

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

04.04.2009 12:48:41

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

Я цитирую::

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

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

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

https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/715681#comment44070202_715681
могу я спросить, почему это "все еще довольно ненадежно"? $ файл passwd --stdin с <<< $(пройти некий_хост/someuser на)
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/715681#comment44128607_715681
@JackTang вам нужны кавычки на расширение параметра. Причина, по которой <<< менее безопасен, чем < с файлом, который имеет хорошие разрешения, заключается в том, что <<
Jens

02.06.2012 12:21:52

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

Fernando Kosh

03.08.2012 04:56:58

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

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

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

echo "password:name" | chpasswd

К:

echo "user:password" | chpasswd

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

https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/11787889#comment52510963_11787889
echo 'user:newpassword' | sudo chpasswd, или без sudo в качестве root.
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/11787889#comment81658031_11787889
Что делать, если пароль содержит "\n " в первом случае? Есть способ справиться с этим? Например, my@secret\npasword123
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/11787889#comment81801775_11787889
Похож на первый, но автоматически повторяет пароль. Кроме того, используйте sudo, иначе он сначала запросит текущий пароль и все испортит. echo password | sed 's/.*/\0\n\0/' | sudo passwd -q $USER 2> /dev/null
bsmoo

08.04.2013 02:18:35

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

echo $1:$2 | chpasswd

BlackNoxis

02.11.2013 11:08:10

В настоящее время вы можете использовать эту команду:

echo "user:pass" | chpasswd
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/19745733#comment52196688_19745733
По какой-то причине я получил следующую ошибку при попытке вашей команды: "ошибка манипуляции токеном аутентификации". Добавление sudo перед chpasswd исправило это для меня.
user3811862

07.07.2014 01:33:43

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

tr -dc A-Za-z0-9 < /dev/urandom | head -c44 | passwd --stdin $user
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/24607373#comment38128552_24607373
Лучше отключить учетную запись / отключить ее логин, чем дать ей неизвестный пароль, но оставить ее логин активным.
https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/24607373#comment44406832_24607373
пароль-удалить или-замок
Mariano Anaya

13.03.2015 01:16:19

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

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

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

03.06.2016 02:06:18

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

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

https://stackoverflow.com/questions/714915/using-the-passwd-command-from-within-a-shell-script/37603518#comment93416671_37603518
Я исправил самые вопиющие ошибки в этом, но это действительно не лучшая практика вообще. Жесткое кодирование локального файла данных в /usr/bin-это просто ужасная идея.
Raydude

05.05.2017 12:39:51

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