Bash предотвращает расширение символов при чтении из STDIN - PullRequest
2 голосов
/ 02 марта 2012

Я пишу bash-скрипт, который получит пароль через STDIN и пройдет несколько разных проверок.

У меня возникает проблема при использовании пароля, содержащего символы.

Простой пароль grassy в порядке, но сложная комбинация, такая как gra$$y, расширится до gra3308y.

Это скрипт, который я использую:

read INPUT

if [ $(echo -n $INPUT|wc -m) -ge 6 ]

then exit 0
else exit 1

fi

Я пробовал все виды цитат, но не могу помешать паролю STDIN расширять специальные символы.

Вот пример, без одинарных кавычек вокруг исходного значения, что можно сделать, чтобы решить эту проблему?

david@hostname ~ $ echo gra$$| { read INPUT; echo ${INPUT}; }
gra2598

1 Ответ

2 голосов
/ 02 марта 2012

Используйте двойные кавычки вокруг переменных расширения внутри вашего скрипта:

read INPUT
echo "Password was: $INPUT"
if [ $(echo -n "$INPUT" | wc -m) -ge 6 ]
then echo "OK"; exit 0
else echo "Bogus"; exit 1
fi

Во время разработки скрипта используйте echo, чтобы показать, с чем вы работаете, но также используйте двойные кавычки.

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

echo 'gra$$' | bash yourscript

Пропуск одинарных кавычек означает, что оболочка заменит$$ с PID (вероятно, PID родительской оболочки, а не оболочки в конвейере, но с некоторым PID).Это отличается от того, что вы набираете 5 символов плюс символ новой строки после запуска:

bash yourscript

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

$ cat > password-file
gra$$
<control-D>
$ cat password-file
gra$$
$ bash yourscript < password-file

<control-D> - это указатель EOF;он сбрасывает все нулевые символы, введенные с момента ввода последней новой строки, и cat интерпретирует нулевые байты, доступные как EOF.Таким образом, файл содержит 6 символов: буквы g, r, a, два знака $ и символ новой строки.Это будет прочитано вашим сценарием дословно;не будет никакого расширения данных.

...