Почему некоторые команды неправильно заключены в одинарные кавычки? - PullRequest
0 голосов
/ 05 марта 2020

При просмотре вывода set -x видно, что 3 команды после cut заключены в одинарные кавычки. Глядя на сценарий, они не должны быть; им должен предшествовать оператор +.

Конечно, это предполагает несколько вещей:

  1. Это не из-за Убежища, а из-за странного поведения Bash
  2. kubectl port-forward успешно выполнено
  3. Хранилище было инициализировано и готово к распечатке

Почему эти команды заключены в один цитаты?

Некоторые факторы:

  • Происходит на MacOS Mojave
  • Установлен / обновлен GNU Bash через Homebrew
  • Использование терминала MacOS
#!/usr/bin/env bash                                                                
# https://www.vaultproject.io

export VAULT_ADDR='http://127.0.0.1:8200'
theJelly='/tmp/jelly.out'
podVault='vault-0'

###---
### Unseal
###---
echo "Unsealing the Vault..."
set -x
unsealKey="$(grep Unseal $theJelly | cut -d' ' -f4)"
echo "$unsealKey"
kubectl exec -t "$podVault" -- vault operator unseal "$unsealKey"


vault status


######################################################################################
# OUTPUT
# Why are the commands (after cut) preceded with a single quote?
######################################################################################
$ sudo /var/tmp/vaultest.sh
Unsealing the Vault...
++ grep Unseal /tmp/jelly.out
++ cut '-d ' -f4
' unsealKey='blah=                                        # <-- why ' unsealKey=' ?
' echo 'blah=                                             # <-- why ' echo '
blah=
' kubectl exec -t vault-0 -- vault operator unseal 'blah= # <-- why ' kubectl ... '
The connection to the server localhost:8080 was refused - did you specify the right host or port?
+ vault status                                            # <-- then it's okay again?!
Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       1
Threshold          1
Unseal Progress    0/1
Unseal Nonce       n/a
Version            1.3.2
HA Enabled         false

######################################################################################
# JELLY - just an ASCII text file
######################################################################################
HOST:~ tester$ cat -vte /tmp/jelly.out 
^[[0mUnseal Key 1: blah=^[[0m^M$
^[[0m^[[0m^M$
^[[0mInitial Root Token: s.FOO^[[0m^M$
^[[0m^[[0m^M$
^[[0mVault initialized with 1 key shares and a key threshold of 1. Please securely^M$
distribute the key shares printed above. When the Vault is re-sealed,^M$
restarted, or stopped, you must supply at least 1 of these keys to unseal it^M$
before it can start servicing requests.^[[0m^M$
^[[0m^[[0m^M$
^[[0mVault does not store the generated master key. Without at least 1 key to^M$
reconstruct the master key, Vault will remain permanently sealed!^[[0m^M$
^[[0m^[[0m^M$
^[[0mIt is possible to generate new unseal keys, provided you have a quorum of^M$
existing unseal keys shares. See "vault operator rekey" for more information.^[[0m^M$

Если эти действия (ниже) выполняются вручную, они полностью работают; Например: (минус одинарные кавычки)

kubectl exec -t vault-0 -- vault operator unseal blah=

Некоторые диагнозы c шагов:

  • создан новый пользователь для выполнения сценария ; У пользователя по умолчанию есть env vars.
  • установил / обновил iTerm2, чтобы попробовать что-то в дополнение к Терминалу
  • все еще получил тот же результат с новым пользователем / терминалом.
  • написал другой скрипт с аналогичными действиями (bash расширение присвоено переменной)
# similar script
$ cat /tmp/yo.sh
#!/usr/bin/env bash
set -x

yoOut='/tmp/yo.out'

yeOut="$(grep ye $yoOut | cut -d' ' -f4)"

echo "$yeOut"

# data file
$ cat /tmp/yo.out
ya
ye1 ye2 ye3 ye4
yi
yo
yu

# set -x output looks normal
$ /tmp/yo.sh
+ yoOut=/tmp/yo.out
++ grep ye /tmp/yo.out
++ cut '-d ' -f4
+ yeOut=ye4
+ echo ye4
ye4

Так мы и ожидаем, что результат будет выглядеть.

Пожалуйста, помогите, эта проблема сводит меня с ума.

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

В отличие от других языков кавычки в Bash на самом деле просто способ сделать некоторую строку частью слова. Например, cut -d' ' буквально эквивалентно cut '-d ':

$ echo 'foo bar' | cut '-d ' -f1
foo

В тот момент, когда Bash содержит команду, кавычки уже удалены, поэтому он добавляет кавычки самым простым способом. Возможно произвести тот же эффект, что и оригинальная команда. Вы можете go сойти с ума с этим, и все же в конечном итоге с той же самой командой:

$ echo 'foo'" "'bar' | cut $'-'"d"' ' -f1
foo

cut -d' ' просто самая читаемая версия этой команды (за исключением cut --delimiter=' ' IMO), которая Вот почему программисты обычно пишут так.

0 голосов
/ 07 марта 2020

Исправлено ниже; это грубо (и я ненавижу это), но это работает. Расширение параметра сохраняет день - снова. В этом случае:

  1. Используется без смещения (0) и
  2. Сохраняются первые 45 символов, в результате чего ^[[0m^M пропускается до конца

myVar="${myVar:0:44}"

Теперь это отстой, потому что IF длина $myVar всегда меняет разрывы сценария.

...
unsealKey="$(grep Unseal $theJelly | cut -d' ' -f4)"
echo "$unsealKey"
unsealKey="${unsealKey:0:44}"                              # fixed: reassigned
kubectl exec -t "$podVault" -- vault operator unseal "$unsealKey"


vault status


######################################################################################
# OUTPUT
######################################################################################
$ sudo /var/tmp/vaultest.sh
Unsealing the Vault...
++ grep Unseal /tmp/jelly.out
++ cut '-d ' -f4
' unsealKey='blah=                                        # fail
blah=
+ unsealKey=blah=                                         # after reassignment

+ kubectl exec -t vault-0 -- vault operator unseal blah=
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false                                    # success!
...
...