2012-03-02 4 views
2

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

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

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

Это сценарий, я использую:

read INPUT 

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

then exit 0 
else exit 1 

fi 

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

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

[email protected] ~ $ echo gra$$| { read INPUT; echo ${INPUT}; } 
gra2598 
+0

Это не тот stdin, который расширяет его, это оболочка при вызове 'echo' ... один из возможных способов - сохранить его в временном файле и «shred -u» в этом файле. Другим было бы применение 'eval' и' sed' подлыми способами ... – 0xC0000022L

+0

На самом деле ваш исходный скрипт, который читает из STDIN, отлично работает, когда вы вводите 'gra $$' в STDIN, но, конечно, ваша тестовая команда расширяет '$$' прежде чем он будет прочитан в переменной INPUT. – anubhava

+0

Также обратите внимание, что 'read' ест обратную косую черту на вкладке, если вы не используете' -r'. – AmigoNico

ответ

2

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

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', два '$' знаки и символ новой строки. Это будет прочитано вашим сценарием дословно; данных не будет.

+0

Спасибо Джонатан, не уверен, что я думал. +1 – Paulpro

+0

Просто дал ему шанс, и он работает. Я понимаю, что вы имеете в виду расширение эха, это вызывает у меня много путаницы. Большое спасибо за то, что нашли время, чтобы объяснить это! – David

+0

Вы также можете использовать 'set -f', чтобы полностью отключить глобальное переключение для некоторых команд и снова включить его ... – 0xC0000022L

Смежные вопросы