Есть ли способ для передачи конфиденциальных данных в bash, используя подсказку, за любую команду?

Предположим, что я использовал sha1pass генерировать хэш некоторых чувствительных пароль в командной строке. Я могу использоватьsha1pass mysecret выступает генерировать хэш mysecret выступает, но это имеет тот недостаток, чтоmysecret выступает теперь в истории Баш. Есть ли способ, чтобы достичь конечной цели этой команды, избегая при этом открывая mysecret выступает в обычный текст, возможно, с помощью пароль-стиль подскажешь?

Я'm также интересует обобщенный способ, чтобы сделать это для передачи конфиденциальных данных для любой команды. Метод изменится, когда конфиденциальные данные передается в качестве аргумента (например, в sha1pass) или на stdin в какую-то команду.

Есть ли способ, чтобы достичь этого?


Редактировать: этот вопрос привлекал большое внимание, и было несколько хороших ответов, предлагаемых ниже. Резюме:

  • Согласно @Kusalananda'ы ответ, в идеале, никогда бы не дать пароль или секретный как аргумент командной строки в программу. Это уязвимые несколькими способами, как описано им, и необходимо использовать более эффективные утилиты, которая способна секретный ввод вывод
  • @vfbsilva'ы ответ описано, как предотвратить вещи из хранящихся в истории Баш
  • @Джонатан'ы ответ описывает вполне хороший способ для решения этой проблемы так долго, как программа может иметь свои секретные данные на стандартный ввод. Таким образом, Я'вэ решил принять этот ответ. sha1pass в мой ОП был просто пример, но обсуждение было установлено, что существуют более эффективные инструменты, которые берут данные на стандартный ввод.
  • как @Р.. отмечает в его ответом, использование расширения команды на переменной не сейф.

Так, в резюме, Я'вэ принят @Джонатан'ы ответ, поскольку он's лучшее решение, учитывая, что у вас хорошо разработаны и хорошо себя программу для работы. Хотя пароль или секретный как аргумент командной строки является принципиально небезопасной, остальные ответы способы смягчения простых соображений безопасности.

Комментарии к вопросу (10)

В идеале, вы никогда не ввести пароль в виде простого текста в командной строке в качестве аргумента команды. В таком случае пароль аргумента команде, и аргументы командной строки можно увидеть в таблице процессов с помощью простых инструментов, таких как ПС или войти в некоторые журналы аудита.

Сказав, что, есть, конечно, способы сокрытия фактических пароль из оболочки'командная история.

sha1pass "$( head -n 1 )"

Затем введите пароль и нажмите <и>введите</КБД>. Руководитель команды здесь принимают ровно одну строку ввода и последние строки, что вы типа не будет частью данных, которые передаютсяsha1pass`.

Чтобы избежать персонажей с Эхом:

sha1pass "$( stty -echo; head -n 1; stty echo )"

Команды будут действовать до его закрытия-Эхо выключает отображение введенные символы на терминале. Эхо затем восстанавливается сдействовать до его закрытия Эха`.

Переходить на стандартный ввод, что последняя команда может быть изменено (вы сделали бы это, если sha1pass принятые данные на стандартном вводе, но появляется, как будто это конкретное утилита игнорирует его стандартный ввод):

{ stty -echo; head -n 1; stty echo; } | somecommand

Если вам нужен многоканальный вход (вышеупомянутое предполагает, что одна строка должна быть передана, с символом перевода строки в конце), а затем заменить все глава команды cat и завершить ввод (при условии somecommand сам читает до конца файла) с <и>сочетание клавиш Ctrl+Д</роз> (далее <и>возвращение</роз> если вы хотите включить символ новой строки во входном, или дважды, если нет).

Это будет работать независимо от того, какую оболочку вы используете (так как это был Борн-нравится или RC-типа раковины).

Снаряды Some могут быть сделаны не сохранить введенный команды в файлы истории, если команде предшествует пробел. Обычно это подразумевает наличие в сеть HISTCONTROL к ignorespace значение`. Это подтверждается, по крайней мере,БашиКШна OpenBSD, а не, например,ksh93илитире.ЗШпользователи могут использоватьhistignorespace опцииилиHISTORY_IGNORE` переменную, чтобы определить шаблон в игнор.

В снаряды, которые поддерживают чтение с "читать", не повторяя символы в терминал, вы также можете использовать

IFS= read -rs password     # -s turns off echoing in bash or zsh
                           # -r for reading backslashes as-is,
                           # IFS= to preserve leading and trailing blanks
sha1pass "$password"

но это, очевидно, по-прежнему имеет тот же вопрос с потенциально раскрывая пароль в таблице процессов.

Если программа читает из стандартного ввода, и если оболочка поддерживает "и вот-строки&" и выше может быть изменено, чтобы


IFS= read -rs password
somecommand 
Комментарии (15)

Если вы установите HISTCONTROL вот так:

HISTCONTROL=ignorespace

и запустить команду с пробелом:

~$  mycommand

он выиграл'т быть сохранены в истории.

Комментарии (0)
Решение

Если вы используете ЗШ или Баш раковины, используйте опцию-s чтение раковины встроенные, чтобы прочитать строку из терминального устройства без него эхом.

IFS= read -rs VARIABLE < /dev/tty

Затем вы можете использовать некоторые необычные перенаправление, чтобы использовать переменную в качестве стандартного ввода.


sha1pass 
Комментарии (6)

Передавать конфиденциальные данные через трубу или здесь-док:

command_with_secret_output | command_with_secret_input

или:


command_with_secret_input 
Комментарии (12)

Просто записать значение в файл и передайте файл:

$ cat > mysecret
Big seecreeeet!
$ cat mysecret | sha1pass 

Я'м не уверен, как sha1pass работает, если ее можно взять в качестве входного файла, вы можете использовать sha1pass < mysecret выступает. Если нет, с помощью "кошки" может стать проблемой, поскольку он включает в себя заключительную строку. Если это's в случае использования (если ваша "голова" поддерживает ):

head -c-1 mysecret | sha1pass 
Комментарии (6)

Если что terdon таки возможно, то, что's самый лучший раствор, проходящий через стандартный ввод. Единственная проблема осталось, это он написал пароль на диск. Мы можем вместо этого сделать:

stty -echo
echo -n "password: "
head -1 | sha1pass
stty echo

Как Kusalananda сказал, действовать до его закрытия -Эхо гарантирует, что вы типа не видели, пока вы не действовать до его закрытия Эхораз.голову -1получите одну строку из стандартного ввода и передать его наsha1pass`.

Комментарии (0)

Я хотел бы использовать

в <предварительно><код>sha1pass " и$(кошка)"и </код></пре>

кошка будут читать из stdin до конца строки, которая может быть вызвана нажатием Ctrl+D. Затем, результат будет передан как аргумент в sha1pass

Комментарии (1)