Предположим, что я использовал sha1pass генерировать хэш некоторых чувствительных пароль в командной строке. Я могу использовать
sha1pass mysecret выступает генерировать хэш mysecret выступает, но это имеет тот недостаток, что
mysecret выступает теперь в истории Баш. Есть ли способ, чтобы достичь конечной цели этой команды, избегая при этом открывая mysecret выступает в обычный текст, возможно, с помощью пароль
-стиль подскажешь?
Я'm также интересует обобщенный способ, чтобы сделать это для передачи конфиденциальных данных для любой команды. Метод изменится, когда конфиденциальные данные передается в качестве аргумента (например, в sha1pass) или на stdin в какую-то команду.
Есть ли способ, чтобы достичь этого?
Редактировать: этот вопрос привлекал большое внимание, и было несколько хороших ответов, предлагаемых ниже. Резюме:
sha1pass
в мой ОП был просто пример, но обсуждение было установлено, что существуют более эффективные инструменты, которые берут данные на стандартный ввод.Так, в резюме, Я'вэ принят @Джонатан'ы ответ, поскольку он's лучшее решение, учитывая, что у вас хорошо разработаны и хорошо себя программу для работы. Хотя пароль или секретный как аргумент командной строки является принципиально небезопасной, остальные ответы способы смягчения простых соображений безопасности.
В идеале, вы никогда не ввести пароль в виде простого текста в командной строке в качестве аргумента команды. В таком случае пароль аргумента команде, и аргументы командной строки можно увидеть в таблице процессов с помощью простых инструментов, таких как ПС
или войти в некоторые журналы аудита.
Сказав, что, есть, конечно, способы сокрытия фактических пароль из оболочки'командная история.
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 <<<"$password"
Сводка комментариев ниже:
Выполнение команды с помощью пароля, указанных в командной строке, что все команды выше, за исключением того, что трубы в данные команды, может сделать пароль видимым для тех, кто работает на ПС
в то же время. Однако ни одна из вышеперечисленных команд будет сохранить введенный пароль в оболочке'файл истории, если выполнена из интерактивной оболочки.
Хорошо ведет себя программу, которая считывает пароли сделать это, читая их из стандартного ввода, из файла или напрямую из терминала.
sha1pass
не требует пароля в командной строке, либо набраны в прямой или иной форме, используя подстановку команд.
Если возможно, используйте другой инструмент.
Если вы установите HISTCONTROL
вот так:
HISTCONTROL=ignorespace
и запустить команду с пробелом:
~$ mycommand
он выиграл'т быть сохранены в истории.
Если вы используете ЗШ
или Баш
раковины, используйте опцию-s чтение
раковины встроенные, чтобы прочитать строку из терминального устройства без него эхом.
IFS= read -rs VARIABLE < /dev/tty
Затем вы можете использовать некоторые необычные перенаправление, чтобы использовать переменную в качестве стандартного ввода.
sha1pass <<<"$VARIABLE"
Если кто-либо бежит ПС
, все они'посмотрю есть "sha1pass и".
Это предполагает, что sha1pass
считывает пароль из stdin (в одну строку, игнорируя разделительную строку), когда не дано ни одного аргумента.
Передавать конфиденциальные данные через трубу или здесь-док:
command_with_secret_output | command_with_secret_input
или:
command_with_secret_input <<EOF
$secret
EOF
Это's прекрасно для секреты в (не на экспорт) переменные Shell, но вы можете никогда не использовать эти переменные в командной строке, только в здесь-документы и внутренние оболочки.
Как отметил Kusalananda в комментарии, если вы'повторного ввода команд в интерактивной оболочке, линии вы вводите для Вот документ будет храниться в оболочке истории, так это's не безопасный для ввода пароля есть, но оно должно по-прежнему быть безопасным в использовании оболочки переменных, содержащих тайну; истории будет содержать текст $тайну
а не то, что $секрет
расширен.
Использование командной расширениями не безопасная:
command_with_secret_input "$(command_with_secret_output)"
потому что выход будет включен в командную строку и отображается в ПС
выхода (или вручную читать из /proc), за исключением систем с матерым /тез.Докл.
Присвоение переменной слишком хорошо:
secret=$(command_with_secret_output)
Просто записать значение в файл и передайте файл:
$ cat > mysecret
Big seecreeeet!
$ cat mysecret | sha1pass
Я'м не уверен, как sha1pass
работает, если ее можно взять в качестве входного файла, вы можете использовать sha1pass < mysecret выступает
. Если нет, с помощью "кошки" может стать проблемой, поскольку он включает в себя заключительную строку. Если это's в случае использования (если ваша "голова" поддерживает -с
):
head -c-1 mysecret | sha1pass
Если что terdon таки возможно, то, что's самый лучший раствор, проходящий через стандартный ввод. Единственная проблема осталось, это он написал пароль на диск. Мы можем вместо этого сделать:
stty -echo
echo -n "password: "
head -1 | sha1pass
stty echo
Как Kusalananda сказал, действовать до его закрытия -Эхо
гарантирует, что вы типа не видели, пока вы не действовать до его закрытия Эхораз.
голову -1получите одну строку из стандартного ввода и передать его на
sha1pass`.
Я хотел бы использовать
в <предварительно><код>sha1pass " и$(кошка)"и </код></пре>
кошка
будут читать из stdin до конца строки, которая может быть вызвана нажатием Ctrl+D. Затем, результат будет передан как аргумент в sha1pass