Я думаю, что здесь произошло то, что строка base64 содержит некоторые встроенные пробелы, и это вызывает фактический «недопустимый ввод» w (и то, что вы наблюдаете как мусор).
Команда openssl rand -base64 64
вводитнекоторые символы новой строки (не пробелы), например,
openssl rand -base64 64 > b64.txt
... затем просматривая файл b64.txt в редакторе, я вижу две отдельные строки
tPKqKPbH5LkGu13KR6zDdJOBpUGD4pAqS6wKGS32EOyJaK0AmTG4da3fDuOI4T+k
abInqlQcH5k7k9ZVEzv8FA==
... иэто означает, что между символами «k» и «a» есть символ новой строки
Таким образом, строка base64 имеет этот встроенный символ новой строки. base64 -d
может обрабатывать символы новой строки (как продемонстрировал ваш успешный пример), но не может обрабатывать символ пробела.
Символы новой строки могут переводиться в пробелы с помощью некоторых действий оболочки. Скорее всего, это происходит с помощью echo $t
Т.е., если t
имеет внутри себя новые строки, тогда эхо просто заменит один пробел. Фактически, его поведение может зависеть от параметров оболочки и типа применяемых строковых кавычек.
Чтобы исправить команду, мы можем удалить символ новой строки перед передачей в команду base64 -d
.
Один из способов сделать это - использовать команду tr
, например, в Linux работает следующее:
t=$(openssl rand -base64 64 | tr -d '\n')
echo $t | base64 -d
... или, альтернативно, удалить пробелы, снова используя tr
t=$(openssl rand -base64 64)
echo $t | tr -d ' ' | base64 -d