Я пытаюсь массово установить несколько паролей учетных записей пользователей, используя chpasswd
. Пароли должны генерироваться случайным образом и распечатываться stdout
(мне нужно записать их или поместить в хранилище паролей), а также передать в chpasswd
.
Наивно, я бы сделал это так
{
echo student1:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
echo student2:$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
} | tee >(chpasswd)
Однако я беспокоюсь о передаче нового пароля в качестве аргумента командной строки echo
, потому что аргументы обычно видны другим пользователям ps -aux
(хотя я никогда не видел, чтобы в них echo
появлялась какая-либо строка ps
).
Есть ли альтернативный способ добавить значение к моему возвращенному паролю, а затем передать его в chpasswd
?
echo
это встроенная оболочка Это не появится в таблице процессов.Ответы:
Ваш код должен быть безопасным, так как
echo
он не будет отображаться в таблице процессов, поскольку это встроенная оболочка.Вот альтернативное решение:
Это создает ваши имена учеников и пароли,
n
из них, без передачи каких-либо паролей в любой командной строке любой команды.В
paste
подсобном склеивает несколько файлов в виде столбцов и вставляет разделитель в промежутке между ними. Здесь мы используем:
в качестве разделителя и даем ему два «файла» (процесса замены). Первый содержит выходные данныеseq
команды, которая создает 20 имен пользователей учеников, а второй содержит выходные данные конвейера, который создает 20 случайных строк длиной 13.Если у вас есть файл с уже созданными именами пользователей:
Это позволит сохранить пароли и имена пользователей в файле
secret.txt
вместо отображения сгенерированных паролей в терминале.источник
echo
илиprintf
, тем не менее, код немного неудобен для расшифровкиecho
встроенную оболочку. На большинстве снарядов это так, но абсолютно никаких требований к этому нет.tee secret.txt > >(chpasswd)
иtee secret.txt | chpasswd
? Последнее кажется гораздо более распространенным, поэтому мне интересно, почему вы решили использовать замену процесса вместо простой трубыtee
). Теперь, когда вы указали на это, я думаю, что на самом деле это изменится (выглядит лучше). Благодарю.echo
Скорее всего, встроен в оболочку, поэтому он не будет отображатьсяps
как отдельный процесс.Но вам не нужно использовать подстановку команд, вы можете просто получить выходные данные из конвейера напрямую
chpasswd
:Если вы хотите изменить несколько паролей одним прогоном
chpasswd
, то должно быть легко повторить основные части. Или превратить это в функцию:Как в стороне: это
head /dev/urandom
кажется немного странным, такurandom
как не ориентировано на линию. Он может считывать из него чрезмерное количество байтов, что повлияет на представление ядра о доступной энтропии, что, в свою очередь, может привести к/dev/random
блокировке. Возможно, было бы лучше просто прочитать фиксированный объем данных и использовать что-то вродеbase64
преобразования случайных байтов в печатные символы (вместо того, чтобы просто отбрасывать около 3/4 байтов, которые вы получаете).Нечто подобное даст вам ок. 16 символов и цифр:
(то есть на 16 меньше количества символов
+
и/
на выходеbase64
. Вероятность того или другого равна 1/32 на символ, поэтому, если я правильно понял свою комбинаторику, это дает примерно 99% шанса оставить как минимум 14 символов, и шанс 99,99% оставить хотя бы 12.)источник
printf
решение не делать то , что мой исходный код делает: возвращает несколько строк для нескольких пользователей, но я ценю ваши замечания поhead urandom
head -c 10 | base64
трубопровод или Нильсаhead | tr
? 10 «строк» случайных байтов, скорее всего, будут сотнями байтов (учитывая, что только 1 из 256 будет новой строкой), хотя в теории это может быть ровно 10 байтов, но шансы на это совершенно незначительны. Точно так же при использованииbase64
, если случайные байты оказываются справедливыми\xff
, то base64 будет просто цепочкой слэшей, но это тоже маловероятно. Если вы заботитесь, вы можете прочитать более 10 байтов, уменьшить вероятность этого, а затем сократить длину полученного результата./dev/urandom
, но риск не равен 0%.