Предположим, что я использовал sha1pass
для генерации хеш-кода некоторого секретного пароля в командной строке. Я могу использовать sha1pass mysecret
для генерации хеша, mysecret
но это имеет тот недостаток, который mysecret
сейчас есть в истории bash. Есть ли способ выполнить конечную цель этой команды, избегая раскрытия mysecret
в виде простого текста, возможно, с помощью passwd
приглашения -style?
Я также заинтересован в обобщенном способе сделать это для передачи конфиденциальных данных любой команде. Метод будет меняться, когда конфиденциальные данные передаются в качестве аргумента (например, в sha1pass
) или в STDIN какой-либо команде.
Есть ли способ сделать это?
Изменить : Этот вопрос привлек большое внимание, и было несколько хороших ответов, предложенных ниже. Резюме:
- Согласно ответу @ Kusalananda , в идеале никогда бы не пришлось вводить пароль или секрет в качестве аргумента командной строки для утилиты. Это уязвимо в нескольких отношениях, как он его описал, и следует использовать более совершенную утилиту, способную принимать секретные данные на STDIN.
- Ответ @ vfbsilva описывает, как предотвратить сохранение вещей в истории bash.
- @ В ответе Джонатана описан совершенно хороший метод для достижения этой цели, если программа может хранить свои секретные данные в STDIN. Поэтому я решил принять этот ответ.
sha1pass
в моем ОП был только пример, но обсуждение установило, что существуют лучшие инструменты, которые принимают данные о STDIN. - а @R .. отмечает в своем ответе , использование расширения команды на переменном не безопасно.
Итак, в целом, я принял ответ @ Jonathan, так как это лучшее решение, учитывая, что у вас есть хорошо продуманная и хорошо управляемая программа для работы. Хотя передача пароля или секрета в качестве аргумента командной строки принципиально небезопасна, другие ответы предоставляют способы смягчения простых проблем безопасности.
sha1pass mysecret
работает, и, следовательно, знать, что этоmysecret
такое. (Это работает только в течение нескольких секунд , в то время как программа выполняется, конечно ...)Ответы:
При использовании оболочки
zsh
илиbash
используйте опцию -sread
встроенной оболочки, чтобы прочитать строку из оконечного устройства, не повторяя ее.Затем вы можете использовать некоторое перенаправление, чтобы использовать переменную в качестве стандартного ввода.
Если кто-нибудь запустится
ps
, он увидит только «sha1pass».Это предполагает, что
sha1pass
считывает пароль из stdin (в одной строке, игнорируя разделитель строк), когда не задано никакого аргумента.источник
sha1pass
не использует свой стандартный поток ввода.sha1pass
был просто примером в моем ОП, и явно не лучшим выбором для этого.ps
, но может быть записан во временный файл - если кто-то хочет избежать этого, тоsshpass < <(printf '%s\n' "$VARIABLE")
может быть рассмотрен (потому чтоprintf
это встроенная, а не внешняя команда, не передаетсяexecv
и не доступна черезps
).В идеале, вы никогда не должны вводить открытый текстовый пароль в командной строке в качестве аргумента команды. Это делает пароль аргументом команды, а аргументы командной строки можно увидеть в таблице процессов, используя простые инструменты, такие как
ps
или зарегистрированные в некоторых журналах аудита.Сказав это, безусловно, есть способы скрыть фактический пароль от истории команд оболочки.
Затем введите пароль и нажмите Enter.
head
Команда , используемая здесь принимает ровно одну строку ввода и последний символ новой строки , что вы типа не будет частью данных , который передаетсяsha1pass
.Чтобы символы не повторялись:
Команда
stty -echo
отключает отображение введенных символов на терминале. Эхо затем восстанавливается с помощьюstty echo
.Чтобы передать стандартный ввод, эту последнюю команду можно изменить (вы бы сделали это, если бы
sha1pass
приняли данные на стандартном вводе, но похоже, что эта конкретная утилита игнорирует свой стандартный ввод):Если вам требуется многострочный ввод (в приведенном выше примере предполагается, что должна быть пропущена одна строка без символа новой строки в конце), тогда замените всю
head
команду наcat
и завершите ввод (предполагая, чтоsomecommand
он читает до конца файла) с помощью Ctrl+D( следующее, Returnесли вы хотите включить символ ввода новой строки во ввод, или дважды, если нет).Это будет работать независимо от того, какую оболочку вы используете (если это была оболочка типа Bourne или rc).
Некоторые оболочки могут быть сделаны, чтобы не сохранять введенные команды в своих файлах истории, если команде предшествует пробел. Обычно это связано с необходимостью установить
HISTCONTROL
значениеignorespace
. Это поддерживается по крайней мереbash
иksh
в OpenBSD, но не, например,ksh93
илиdash
.zsh
пользователи могут использовать этуhistignorespace
опцию или ихHISTORY_IGNORE
переменную для определения шаблона, который следует игнорировать.В оболочках, которые поддерживают чтение
read
без вывода символов на терминал, вы также можете использоватьно это, очевидно, все еще имеет ту же проблему с возможным раскрытием пароля в таблице процессов.
Если утилита читает из стандартного ввода, и если оболочка поддерживает «here-строки», вышеприведенное можно изменить на
Сводка комментариев ниже:
Выполнение команды с паролем, заданным в командной строке, что делают все вышеперечисленные команды, кроме той, которая передает данные в команду, потенциально сделает пароль видимым для всех, кто работает
ps
одновременно. Однако ни одна из приведенных выше команд не сохранит введенный пароль в файле истории оболочки, если он выполняется из интерактивной оболочки.Программы с хорошим поведением, которые считывают пароли в виде открытого текста, делают это, считывая данные из стандартного ввода, из файла или непосредственно из терминала.
sha1pass
Для этого требуется пароль в командной строке, либо введенный напрямую, либо с использованием какой-либо формы подстановки команд.Если это вообще возможно, используйте другой инструмент.
источник
$(...)
будет частью командной строки и будет виден вps
выходных данных, за исключением системы с усиленной / proc.sha1pass
run без пароля в командной строке, кажется, производит вывод, ничего не читая ... Так что OP должен выбрать другой инструмент.Если вы установите
HISTCONTROL
так:и запустите команду с пробелом:
это не будет сохранено в истории.
источник
Передайте конфиденциальные данные через канал или здесь-документ:
или:
Хорошо, когда секреты хранятся в (неэкспортируемых) переменных оболочки, но вы никогда не сможете использовать эти переменные в командной строке, только в документах here и внутри оболочки.
Как отметил Кусалананда в комментарии, если вы вводите команды в интерактивной оболочке, строки, которые вы вводите для документа здесь, будут сохранены в истории оболочки, поэтому вводить пароль там небезопасно, но он все равно должен быть безопасно использовать переменные оболочки, содержащие секреты; история будет содержать текст,
$secret
а не что-либо$secret
расширенное до.Использование расширений команд небезопасно :
потому что вывод будет включен в командную строку и виден в
ps
выводе (или при чтении вручную из / proc), за исключением систем с усиленной / proc.Назначение переменной тоже хорошо:
источник
command_with_secret_output
которая позволяет мне печатать секретный вывод. Существует ли такая команда, которую можно заменить здесь?bash
сеансе документ будет сохранен в файле истории.read
, напримерread -r secret
. Тогда ваш секрет в$secret
. Вы можете запустить stty до / после него, чтобы скрыть ввод, если хотите.sha1pass
кажется принципиально сломанным / непригодным / небезопасным, поскольку не может прочитать пароль из стандартного ввода или файла. Думаю, для решения проблемы нужна другая утилита.read -rs
выполнит работу (если вы включите,-r
чтобы иметь возможность иметь пароли с обратными слешами в них), но затем вы вернетесь к тому, чтобы потенциально показать пароль в списке процессов (и в зависимости от того, включен ли учет процессов и как он настроен , в журналах учета процессов, а также).Просто запишите значение в файл и передайте файл:
Я не уверен, как
sha1pass
работает, если он может принять файл в качестве ввода, вы можете использоватьsha1pass < mysecret
. Если нет, использованиеcat
может быть проблемой, так как он включает в себя последний перевод строки. Если это так, используйте (еслиhead
поддерживает-c
):источник
cat | sha1pass
?cat mysecret | sha1pass
иsha1pass < mysecret
имеют такое же поведение по отношению к последним переводам строки.cat
не добавляет новые строки. В любом случае, еслиsha1pass
поддерживается передача пароля через стандартный ввод, я ожидаю, что он сам по себе будет игнорировать последний перевод строки. Файлы со строками, которые не заканчиваются символами новой строки, в конце концов, являются неестественными в unix, поэтому было бы неудобно ожидать файл, который не завершается символом новой строки.cat | sha1pass
кажется, работает,sha1pass
прежде чем дать мне шанс ввести любой ввод. II) Нет, конечноcat mysecret
, не добавляет новую строку, я никогда не говорил,cat
добавляет его, только то, что он включает его.< mysecret
удаляет его тоже. :)head -c-1
. Я думаю, я просто запутался, зачем использовать,cat mysecret | sha1pass
а потом предложуsha1pass < mysecret
. Я предполагаю, что беспокойство заключается в том, что sha1pass может жаловаться на обычные файлы для stdin; Я не уверен почему.sha1pass
и не смог найти руководство или-h
или любую другую форму документации в течение нескольких минут я провел поиск и поэтому не мог понять, если работаетsha1pass foo
лечения вfoo
качестве входной строки или в качестве входного файла , Поэтому я дал варианты, чтобы иметь дело с каждой возможностью.Если то, что сделал Тердон, возможно, то это лучшее решение, проходящее через стандартный ввод. Осталась только одна проблема - он записал пароль на диск. Мы можем сделать это вместо этого:
Как сказал Кусалананда,
stty -echo
то , что вы печатаете, не будет видно, пока вы не сделаете этоstty echo
снова.head -1
получит одну строку из стандартного ввода и передать егоsha1pass
.источник
я хотел бы использовать
cat
будет читать со стандартного ввода доEOF
, что может быть вызвано нажатием Ctrl + D. Затем результат будет передан в качестве аргументаsha1pass
источник