Передать переменную в строку в файле оболочки

Кажется, что

--enable password

важен на

https://lists.fedoraproject.org/pipermail/users/2013-November/442288.html

virt-sysprep -a foo.qcow2 --enable password --root-password password:123456

В противном случае virt-sysprep перезаписывает многие другие вещи в необработанном виде. образ, повредив его, так что вы не можете с него загрузиться.

Отсутствие - включить пароль привело к

$ virt-sysprep -a Fedora-Cloud-Base-22-20150521.i386.raw  --root-password password:1234
Examining the guest ...
Performing "yum-uuid" ...
Performing "utmp" ...
Performing "udev-persistent-net" ...
Performing "tmp-files" ...
Performing "sssd-db-log" ...
Performing "ssh-userdir" ...
Performing "ssh-hostkeys" ...
Performing "smolt-uuid" ...
Performing "script" ...
Performing "samba-db-log" ...
...

, но, используя его в первый раз, было не очевидно, что это плохо.

При правильном вызове он касается только парольной части образа:

$ virt-sysprep -a Fedora-Cloud-22-password.i386.raw --enable password --root-password password:XXXX
Examining the guest ...
Performing "password" ...

И теперь я могу войти в виртуальную машину.

0
14.05.2018, 22:43
2 ответа

Debe usar comillas dobles -en lugar de comillas simples --comillas simples -para evitar que se produzca una expansión variable. Prueba esto en su lugar:

#!/bin/bash

NETWORKNAME=PCEXCHANGE
VERSION=1.1.0

ORGANIZATIONS=( "Asus" "Dell" "HP" "Amazon" )
PRODUCERS=( "Asus" "Dell" "HP" )
MAKERS=( "Amazon" )

for org in ${PRODUCERS[@]}
do
    for maker in ${MAKERS[@]}
        do
            docker exec cli.${maker} bash -c "peer channel create -c ${org,,} -f./channels/${org}.tx -o orderer.${NETWORKNAME,,}.com:7050"
    done
done
1
28.01.2020, 02:18

Чтобы безопасно передавать переменные в bash -cдочернюю оболочку, вы должны использовать

bash -c 'script goes here' bash "arg1" "arg2" "arg3"...

То есть,

#!/bin/bash

NETWORKNAME=PCEXCHANGE
VERSION=1.1.0

ORGANIZATIONS=( "Asus" "Dell" "HP" "Amazon" )
PRODUCERS=( "Asus" "Dell" "HP" )
MAKERS=( "Amazon" )

for org in "${PRODUCERS[@]}"; do
    for maker in "${MAKERS[@]}"; do
        docker exec "cli.$maker" \
            bash -c 'peer channel create -c "$1" -f "$2" -o "$3"' bash \
                "${org,,}" "./channels/$org.tx" "orderer.${NETWORKNAME,,}.com:7050"
    done
done

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

Также обратите внимание на цитирование других расширений в скрипте, благодаря чему он работает, даже если производители или производители имеют пробелы в своих значениях.

Аргумент bashпосле текста самого скрипта bash -cпередается в $0. Обычно это имя скрипта или интерпретатора, поэтому мы просто передаем строку bash.

3
28.01.2020, 02:18

Теги

Похожие вопросы