У меня есть небольшой файл сценария под названием testing.sh
, где я прошу пользователя ввести свой логин и пароль. Затем пароль шифруется командой md5sum
, и результат сохраняется в файле results.txt
в форме login:md5password
. Однако, когда я просматриваю файл results.txt
, я получаю только login:
, зашифрованный пароль не соединяется. Что я делаю не так?
Вот файл testing.sh
:
#!bin/bash
read -p 'Your login: ' uservar
read -sp 'Your password: ' passvar
var=$passvar|md5sum
echo $uservar:$var > ~/Desktop/results.txt
results.txt
Файл:
login:
Вы делаете var
задание неправильно.
var=$passvar|md5sum
Вы должны отправить "$passvar"
в md5sum
. Он не пройдет через трубу |
сам по себе, поэтому вам нужно либо использовать echo
, либо printf
. Это выведет вещи в поток stdout
. Вы можете записать это в переменную с помощью подстановки команд $(...)
. Другими словами, вы должны делать:
var=$( echo "$passvar" | md5sum )
Также, пожалуйста, не забудьте заключить в кавычки переменные, чтобы сохранить целостность данных, хранящихся в них, и предотвратить разбиение слов .
Другие проблемы:
$ read -sp 'Your password:' passvar
Your password:$ var=$( echo "$passvar" | md5sum )
$ echo "$var"
2b00042f7481c7b056c4b410d28f33cf -
Здесь обратите внимание на две вещи: после «Вашего пароля» нет новой строки, поэтому вы можете добавить echo
после этой команды. Во-вторых, обратите внимание, что md5sum
выводит имя файла после вычисленной контрольной суммы md5, которая в этом случае является потоком -
или stdin
. Возможно, вы захотите избавиться от этой части с помощью любой утилиты обработки текста, которая позволит вам вырезать слова, например, awk
:
var=$( echo "$passvar" | md5sum | awk '{print $1}')
. В качестве альтернативы, вы можете просто использовать bash
читать и здесь-строку <<<
(см. это для получения дополнительной информации об этом операторе):
$ read var trash <<< $( echo "$passvar" | md5sum )
$ echo "$var"
2b00042f7481c7b056c4b410d28f33cf
И последнее, но не менее важное: ваша строка #!
отсутствует /
ранее bin
- должно быть #!/bin/bash
.
Полный сценарий должен быть таким:
#!/bin/bash
read -p 'Your login: ' uservar
read -sp 'Your password: ' passvar
printf "\n"
read var trash <<< "$(printf "%s" "$passvar" | md5sum)"
printf "%s:%s" "$uservar" "$var" #> ~/results.txt
Обратите внимание, что я закомментировал перенаправление в файл, просто чтобы посмотреть вывод на терминале для целей тестирования. Вот как это работает:
$ ./testing.sh
Your login: johndoe
Your password:
johndoe:912ec803b2ce49e4a541068d495ab570$
Для дальнейшего использования вы можете добавить set -x
после #!/bin/bash
(если, конечно, вы правильно определили строку #!
), чтобы устранить неполадки Сценарий и посмотреть, какие команды на самом деле выполняются и могут возникнуть ошибки. Или просто используйте shellcheck онлайн-инструмент.
Следующий скрипт также работает для меня.
#!/bin/bash
echo -n 'Your login:'
read uservar
echo -n 'Your password:'
read -s passvar
printf "\n"
encrpt=$(echo "$passvar" | md5sum | awk '{print $1;}')
echo "$uservar":"$encrpt" > /home/bond/result.txt
Выход
bond@hp-pc:~$ ./test.sh
Your login:bond
Your password:
bond@hp-pc:~$ cat result.txt
bond:22c291f0335f869c154d8081854d9119