Saya mencoba mengatur beberapa kata sandi akun pengguna secara massal chpasswd
. Kata sandi harus dibuat secara acak dan dicetak stdout
(saya harus menuliskannya atau menyimpannya di penyimpanan kata sandi), dan juga diteruskan chpasswd
.
Dengan naif, saya akan melakukan ini seperti ini
{
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)
Namun saya khawatir tentang meneruskan kata sandi baru sebagai argumen baris perintah echo
, karena argumen biasanya terlihat oleh pengguna lain di ps -aux
(meskipun saya tidak pernah melihat echo
baris apa pun muncul di ps
).
Apakah ada cara alternatif untuk menambahkan nilai ke kata sandi saya yang dikembalikan, dan kemudian meneruskannya chpasswd
?
echo
adalah shell built-in. Itu tidak akan muncul di tabel proses.Jawaban:
Kode Anda harus aman karena
echo
tidak akan muncul di tabel proses karena ini merupakan built-in shell.Inilah solusi alternatif:
Ini menciptakan nama dan kata sandi siswa Anda
n
, tanpa menggunakan kata sandi apa pun di baris perintah apa pun dari perintah apa pun.The
paste
utilitas lem bersama-sama beberapa file sebagai kolom dan sisipan pembatas di antara mereka. Di sini, kami menggunakan:
sebagai pembatas dan memberinya dua "file" (proses substitusi). Yang pertama berisi output dariseq
perintah yang menciptakan 20 nama pengguna siswa, dan yang kedua berisi output dari pipa yang menciptakan 20 string acak dengan panjang 13.Jika Anda memiliki file dengan nama pengguna yang telah dibuat:
Ini akan menyimpan kata sandi dan nama pengguna ke file
secret.txt
alih-alih menunjukkan kata sandi yang dihasilkan di terminal.sumber
echo
atauprintf
, namun kodenya agak canggung untuk diuraikanecho
menjadi builtin shell. Pada kebanyakan kerang, tapi sama sekali tidak ada persyaratan bahwa itu adalah.tee secret.txt > >(chpasswd)
dantee secret.txt | chpasswd
? Yang terakhir ini tampaknya jauh lebih umum, jadi saya bertanya-tanya mengapa Anda memilih untuk menggunakan proses substitusi alih-alih pipa biasatee
). Sekarang setelah Anda menunjukkannya, saya pikir saya akan benar-benar mengubahnya (terlihat lebih baik). Terima kasih.echo
sangat mungkin dibangun ke dalam shell, sehingga tidak akan munculps
sebagai proses terpisah.Tetapi Anda tidak perlu menggunakan substitusi perintah, Anda hanya dapat memiliki output dari pipa langsung ke
chpasswd
:Jika Anda ingin mengubah beberapa kata sandi dengan sekali jalankan
chpasswd
, seharusnya mudah untuk mengulangi bagian-bagian penting. Atau membuatnya menjadi fungsi:Sebagai tambahan: itu
head /dev/urandom
terasa agak aneh karenaurandom
tidak berorientasi garis. Mungkin membaca jumlah byte yang berlebihan dari itu, yang akan mempengaruhi gagasan kernel tentang entropi yang tersedia, yang pada gilirannya dapat menyebabkan/dev/random
pemblokiran. Mungkin lebih bersih untuk hanya membaca jumlah data yang tetap, dan menggunakan sesuatu sepertibase64
untuk mengkonversi byte acak ke karakter yang dapat dicetak (bukan hanya membuang sekitar 3/4 byte yang Anda dapatkan).Sesuatu seperti ini akan memberi Anda sekitar. 16 karakter dan angka:
(Yaitu, 16 lebih sedikit dari jumlah
+
dan/
karakter dalam output daribase64
. Peluang dari keduanya adalah 1/32 per karakter, jadi jika saya benar kombinatorik saya, yang memberikan sekitar 99% kemungkinan meninggalkan setidaknya 14 karakter, dan kemungkinan 99,99% meninggalkan setidaknya 12.)sumber
printf
solusi tidak melakukan apa kode asli saya tidak: kembali beberapa baris untuk beberapa username, tapi saya menghargai komentar Anda padahead urandom
head -c 10 | base64
pipeline saya , atau yang Nils denganhead | tr
? 10 "baris" byte acak sangat mungkin ratusan byte (mengingat bahwa hanya 1 dari 256 yang akan menjadi baris baru), meskipun secara teori mungkin tepat 10 byte, tetapi kemungkinan itu benar-benar dapat diabaikan. Demikian pula ketika menggunakanbase64
, jika byte acak kebetulan saja\xff
, maka base64 akan menjadi hanya serangkaian garis miring, tapi itu juga tidak mungkin. Jika Anda peduli, Anda dapat membaca lebih dari 10 byte, yang mengurangi peluang itu, dan kemudian memotong panjang output yang dihasilkan./dev/urandom
, tetapi risikonya bukan 0%.