Я пишу сценарий оболочки, который должен быть несколько безопасным, т. Е. Не передает защищенные данные через параметры команд и предпочтительно не использует временные файлы. Как передать переменную в команду stdin? Или, если это невозможно, как правильно использовать временные файлы для такой задачи?Как передать значение переменной в stdin команды?
ответ
Что-то же просто, как:
echo "$blah" | my_cmd
Остерегайтесь пробелов в вашей переменной: 'echo '$ blah" 'лучше. –
@ Джонатан: Это хороший момент. Ответ обновлен соответствующим образом ... –
Будет ли это работать, даже когда есть '' 'в' $ blah'? –
Попробуйте это:
echo "$variable" | command
, но не будет отображаться переменная $ content, например. вывод 'ps -u', когда работает эхо? –
нет. 'echo' является встроенным, поэтому в ps нет никакого процесса. – unbeli
Остерегайтесь пробелов в вашей переменной:' echo '$ variable "' лучше. –
(cat <<END
$passwd
END
) | command
cat
не действительно необходимо, но это помогает структурировать код лучше и позволяет использовать более команды в круглых скобках в качестве входных данных для вашей команды.
Но этот метод позволяет передавать несколько строк в вашу команду, а также позволяет пробелы в '$ passwd' – PoltoS
. Это лучший ответ до сих пор, который не пропускает переменное содержимое для отслеживания труб или процессов. – user2688272
Передача значения на стандартный ввод так же просто, как:
your-command <<< "$your_variable"
Всегда убедитесь, что вы положили в кавычки переменных выражений!
Herestrings '<<<' не являются gua насколько я знаю, они не находятся в базе POSIX. Они будут работать, как ожидалось, до тех пор, пока вы используете их только в «bash». Я только упоминаю об этом, потому что они ОП заявили «оболочка», а не «баш». Хотя он и поставил вопрос «bash» ... так что это, очевидно, приемлемый ответ. – TechZilla
Хотя это может быть так, чувствительная информация, скорее всего, будет легче утечка при использовании метода 'echo' из-за создания трубы. Команда herestring будет полностью обработана 'bash', хотя в этой ситуации (как указано) вам лучше знать, что она будет работать на вашем bash, иначе любое сообщение об ошибке, появившееся в результате отсутствия поддержки herestrings, также будет утечка указанной информации , –
@StevenLu Подождите, 'echo' является встроенным. Там нет трубы, верно? Это Unix, но это не может быть так много Unix *. –
Обратите внимание, что операции 'echo "$var" | command
означают, что стандартный ввод ограничен эхо-сигналом. Если вы хотите, терминал должны быть подключены, то вам нужно быть любителем:
{ echo "$var"; cat - ; } | command
(echo "$var"; cat - ) | command
Это означает, что первая линия (s) будет содержанием $var
, но остальное будет исходить от cat
считывая стандартный ввод. Если команда не делает ничего необычного (попробуйте включить редактирование командной строки или запустите как vim
), тогда все будет хорошо. В противном случае вам нужно получить действительно фантазию - я думаю, что expect
или одна из ее производных, вероятно, будет уместной.
Обозначения в командной строке практически идентичны, но вторая запятая необходима с помощью скобок, в то время как она не заключена в круглые скобки.
'(echo" $ LIST "; cat -) | sed 1q это работает для меня, но мне нужно нажать ctrl d, когда я запустил этот скрипт? –
Да,' cat'' продолжает читать с клавиатуры до EOF или прерывания, поэтому вам нужно сказать EOF, набрав control-D. –
есть ли способ вокруг EOF? sed нужен cat –
Согласно ответу Мартина, есть Баш функция называется Здесь Струны (который сам по себе является разновидностью более широко поддерживаются Здесь документов признака).
http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings
3.6.7 Здесь Струны
Вариантом здесь документы, формат:
<<< word
Слово расширяется и подается команда на его стандартный вход.
Обратите внимание, что здесь будут появляться строки, чтобы быть Баш-только, так, для улучшения переносимости, вы, вероятно, будет лучше с оригиналом Здесь документы представлены, в соответствии с ответом PoltoS'S:
(cat <<EOF
$variable
EOF
) | cmd
Или, более простой вариант вышеизложенного:
(cmd <<EOF
$variable
EOF
)
вы можете опустить (
и )
, если вы не хотите, чтобы это перенаправлены дальше в другие команды.
Мне понравился ответ Мартина, но он имеет некоторые проблемы в зависимости от того, что находится в переменной. ! Это
your-command <<< """$your_variable"""
лучше, если переменная содержит "или
Но почему? Кроме того, я не могу воспроизвести никаких проблем: 'foo1 = -; foo2 = '"'; foo3 = \ !; cat <<<" $ foo1 "; cat <<<" $ foo2 "; cat <<<" $ foo3 "' отлично работает для меня. Что именно делают три ' 'делать? AFAIK вы просто добавляете и добавляете пустую строку. – phk
Попробуйте что-то реальное. Как и ваша команда ssh somehost. и ваша переменная - это сценарий оболочки. –
Вобще:
printf "$my_var" | my_cmd
Если переменная не содержит пробелы, кавычки могут быть опущены
При использовании. bash, то вы также можете сделать:
echo -n "$my_var" | my_cmd
Избегайте использования usi ng echo без -n, потому что в конце он будет транслировать рендеринг с добавленной последовательностью строк.
- 1. Как передать значение переменной в команды gpg
- 2. Как передать значение в переменной
- 3. Как передать значение переменной в exec_command в python?
- 4. Как передать ESC в stdin?
- 5. Как передать значение переменной jquery переменной php?
- 6. VimScript: передать значение локальной переменной для редактирования команды
- 7. передать значение переменной в массив
- 8. Powershell: как правильно передать значение команды
- 9. как передать значение переменной js в php
- 10. Как передать значение переменной 2 в javascript?
- 11. Как передать значение переменной в запрос mongo?
- 12. Как передать значение переменной в .filter()
- 13. как передать значение переменной в xml-файл?
- 14. Как передать значение переменной powershell в cmd.exe?
- 15. Как передать значение переменной массиву в C
- 16. Как передать значение переменной session в параметр?
- 17. Как передать значение переменной C# в javascript?
- 18. Как передать значение PHP переменной в JQuery
- 19. Как передать значение переменной php в javascript?
- 20. Как передать значение переменной в унаследованном классе
- 21. Как передать значение переменной в python
- 22. Использование команды echo как stdin в оболочке?
- 23. как передать значение переменной из его цикла в с
- 24. PHP: передать файл в скрипт как stdin
- 25. Как передать значение сеанса, объявленное в переменной контроллера переменной jquery?
- 26. Как читать STDIN в переменной в perl
- 27. передать значение jquery переменной php
- 28. передать значение столбца переменной ssis
- 29. Передать значение переменной URL-адресу
- 30. concatenate stdin и вывод команды
Может ли злоумышленник изменить '$ PATH'? Так что 'cat' можно заменить be'/bin/cat '$ @ "| tee/attacker/can/read/this/file' – 12431234123412341234123