it-roy-ru.com

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

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

adduser $ 1 
 passwd $ 1 
 $ 2 
 $ 2
54
Jared

из "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

[Update] несколько вопросов были подняты в комментариях:

Ваша команда passwd может не иметь опции --stdin: используйте вместо нее утилиту chpasswd, Как это предлагает ashawley .

Если вы используете оболочку, отличную от 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
79
8jean

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

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

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

echo "password:name" | chpasswd

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

echo "user:password" | chpasswd

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

46
Fernando Kosh

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

Я цитирую:

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

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

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

25
lhunath

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

echo "user:pass" | chpasswd

22
BlackNoxis

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

echo $1:$2 | chpasswd

1
bsmoo

Для тех, кому нужно «запускать от имени root» удаленно с помощью сценария, выполняющего вход в учетную запись пользователя в файле 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
1
Raydude

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

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

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

0
Mariano Anaya

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

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

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

0
rmeador

Это окончательный ответ для администратора узла 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 [email protected]"$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
JohnS

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

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

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