Как отправить значение переменной в трубу, скрывая ее из списка процессов?

Я пишу простой сценарий оболочки, который читает PIN один раз (в переменную) и использует его для вызова нескольких команд, которым нужен этот вывод. Эти команды могут указывать на чтение PIN-кода из stdin, но я не знаю, как отправить значение переменной в канал, не показывая его в списке процессов. Обычный способ – использование echo "$PIN" – выполняет подстановку, поэтому значение ПИН-кода будет видимым для других пользователей через список процессов.

Есть ли команда, которая принимает имя переменной и выводит значение этой переменной в stdout? Или есть другой способ?

Поскольку echo встроено во все оболочки, оно не будет отображаться в списке процессов.

Однако он ненадежен для произвольных данных

Вы можете использовать printf '%s\n' "$PIN" для чего-то более надежного, но обратите внимание, что некоторые оболочки pdksh по-прежнему не имеют встроенного printf . Работа для них заключается в использовании print -r -- "$PIN" . print доступен в zsh и всех реализациях ksh , но не является стандартной командой.

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

 cmd << EOF $PIN EOF 

(или здесь-строка ( cmd <<< "$PIN" ) в zsh и несколько других оболочек сейчас). Но обратите внимание, что в большинстве реализаций здесь-документы реализуются с временными файлами, поэтому PIN-код может быть восстановлен в автономном режиме, если файл был привязан к диску.

Лучше не экспортировать PIN в среду, если вы можете избежать его, поскольку его легче обнаружить другими процессами (см. В /proc/pid/environ которые могут обрабатывать процессы с одним и тем же uid, в то время как часто существует больше ограничений относительно того, что может читайте память другого процесса). ps на некоторых (редких) системах также позволяет вам видеть среду любого процесса.

Однажды в среде, хотя в некоторых системах есть команда printenv для отображения ее значения:

 printenv PIN 

Или вы всегда можете использовать perl :

 perl -le 'print $ENV{PIN}'