Аргументи процесу видно всім користувачам, але середовище видно лише тому ж користувачеві ( принаймні, в Linux , і я думаю, що у кожному сучасному варіанті Unix). Тому передача пароля через змінну середовища безпечна. Якщо хтось може прочитати ваші змінні середовища, він може виконувати процеси, як ви, тож це вже гра.
Вміст навколишнього середовища є певним ризиком непрямого протікання, наприклад, якщо ви ps
хочете щось розслідувати і випадково скопіювати і вставити результат, включаючи конфіденційні змінні середовища в публічному місці. Інший ризик полягає в тому, що ви передаєте змінну оточення програмі, яка їй не потрібна (включаючи дітей процесу, який потребує пароля), і ця програма відкриває свої змінні середовища, оскільки не очікувала їх конфіденційності. Наскільки погані ці ризики вторинного витоку, залежить від того, що робить процес із паролем (як довго він працює? Чи запускається підпроцес?).
Простіше переконатися, що пароль не просочиться випадково, передаючи його через канал, який не призначений для підслуховування, наприклад, труба. Це досить легко зробити з боку відправки. Наприклад, якщо у вас є пароль у змінній оболонки, ви можете просто зробити
echo "$password" | theprogram
якщо theprogram
очікує пароля на його стандартному вході. Зауважте, що це безпечно, оскільки echo
це вбудований; це не було б безпечно із зовнішньою командою, оскільки аргумент буде викритий у ps
виході. Ще один спосіб досягти такого ж ефекту - це документ тут:
theprogram <<EOF
$password
EOF
Деякі програми, яким потрібен пароль, можуть сказати, щоб прочитати його з певного дескриптора файлу. Ви можете використовувати дескриптор файлу, який не є стандартним входом, якщо вам потрібно стандартне введення для чогось іншого. Наприклад, за допомогою gpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Якщо програмі не можна сказати читати з дескриптора файлу, але її можна сказати читати з файлу, ви можете сказати, що вона читає з дескриптора файлу, використовуючи ім'я файлу типу `/ dev / fd / 3.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
У ksh, bash або zsh ви можете це зробити більш стисло, шляхом заміни процесу.
theprogram --password-from-file=<(echo "$password")