Кодировка Base64 отличается в сценарии - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь в base64 кодировать строку user: password в сценарии bash, однако результаты в сценарии отличаются от результатов, выполняемых командой в оболочке.

В оболочке (ожидаемый результат):

echo -n "user:password" | base64
dXNlcjpwYXNzd29yZA==

В скрипте (w / -n):

USER=$(echo -n "user:password" | base64)
echo $USER
LW4gdXNlcjpwYXNzd29yZAo=

В скрипте (w / o -n, дополнительный символ в конце):

USER=$(echo "user:password" | base64)
echo $USER
dXNlcjpwYXNzd29yZAo=

Может кто-нибудь сказать мне, что мне здесь не хватает. Спасибо

1 Ответ

3 голосов
/ 22 октября 2019

Используя #!/bin/sh shebang, вы, скорее всего, запрашиваете bash (или какая-либо оболочка позади /bin/sh, которая в настоящее время почти всегда является ссылкой на другую оболочку), чтобы выполнить ваш сценарий в режиме, совместимом с POSIX. :

Если bash вызывается с именем sh, он пытается максимально близко имитировать поведение при запуске исторических версий sh, при этом также соответствует стандарту POSIX.

Ваша проблема в том, что POSIX echo не определяет флаг -n, поэтому он понимается в вашей команде как еще один параметр для отображения в ваших выходных данных. Действительно, LW4gdXNlcjpwYXNzd29yZAo= - это кодировка base64 -n user:password.

. Вы должны использовать printf вместо echo, поведение которого гораздо лучше определено и отличается в разных реализациях меньше.

Более того, если вам не требуется, чтобы ваш сценарий был переносимым и, возможно, выполнялся на платформах, где bash недоступен, я предлагаю вам использовать #!/usr/bin/env bash shebang вместо #!/bin/sh, чтобы вы могли насладиться вкусностями bash.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...