@KeithThompson отредактировано согласно вашим предложениям. Благодарю.

я странная проблема, которая сводит меня с ума! Задача состоит в том, чтобы запустить один набор файлов при первом входе в систему «root» пользователя и другой набор файлов при втором входе в систему того же пользователя. Я решил использовать файлы «.profile» и «.bashrc» и перезагрузить файл «.bashrc» ближе к концу задачи, возникающей при первом входе в систему.

Во время первого входа в систему я создаю закрытый ключ и запрос на подпись сертификата и вызываю API для получения сертификата. Я храню этот сертификат и закрытый ключ в папке с файлами, а затем изменяю «.bashrc», чтобы вызвать второй набор файлов, которые используют этот сертификат и ключ для аутентификации приложения, которое будет запущено.

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

ПЕРВЫЙ КОМПЛЕКТ ФАЙЛОВ

скрипт ".profile"

# .bash_profile
umask 022
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Скрипт ".bashrc"

/myFolder/backgroundTask1.sh &
/myFolder/certificateGenerator.sh

скрипт backgroundTask1.sh

pipe=/myFolder/testpipe
if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi

while true
do
    ## Do some status LED blinking task here
done &

while true
do
    if read line < $pipe; then
        if [[ "$line" == 'success' ]]; then
           ## Kill the background LED blinking task created in the above while loop
           kill $!
           rm $pipe
           exit
        elif [[ "$line" == 'failed' ]]; then
           kill $!
           rm $pipe
           exit
        fi
    fi
done

Сценарий certificateGenerator.sh

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, ПОСЛЕДНИЕ НЕСКОЛЬКО ЛИНИЙ, ГДЕ Я ИЗМЕНИЛА СЦЕНАРИЙ BASHRC

Также обратите внимание на файлы /anotherFolder/myKey.key и /anotherFolder/myCert.crt

#!/bin/bash
## Named pipe location for communicating to backgroundTask1
pipe=/myFolder/testpipe
openssl req -new -newkey rsa:2048 -nodes -out certificateSigningRequest.csr -keyout /anotherFolder/myKey.key -subj "/C=myCountry/ST=myState/L=myCity/O=myCompany/OU=myOU/CN=myDevice"
cert_req=$(<$certificateSigningRequest.csr)

## Get AD token from Azure for talking to my custom API hosted on Azure
response=$(curl -o - -s -w "%{http_code}\n" -X POST \
    https://login.microsoftonline.com/myCompany.onmicrosoft.com/oauth2/token \
    -H 'content-type: application/x-www-form-urlencoded' \
    -d 'grant_type=client_credentials&resource=https%3A%2F%2Fmanagement.core.windows.net%2F&client_id=myClientID&client_secret=mySecret')
if [ $?==0 ]; then
    status=$(echo $response | tail -c 4)
    body=${response::-3}
    token=$(echo $body | jq -r '.access_token')
fi

## Send CSR to my custom API to get certificate
response=$(jq -n --arg csr "$cert_req" \
             '{
                 cert: {
                     csr: $csr
                 }
             }' |
         curl -o - -s -w "%{http_code}\n" -X POST \
             https://myCustomAPI.azurewebsites.net/api/v1/customEndpoint \
             -H "authorization: Bearer $token" \
             -H "content-type: application/json" \
             -d @-
)        

## Parse the response to find out if the request succeeded
if [ $?==0 ]; then
    destCertDir=/anotherFolder/myCert.crt
    status=$(echo $response | tail -c 4)
    body=${response::-3}
    cert=$(echo $body | jq -r '.certificate')
    if [ "$status" == "$http_success" ]; then
        echo "$cert" > "$destCertDir"
        ## Change .bashrc for next boot
        echo '/myFolder/backgroundTask2.sh &' > ~/.bashrc
        echo '/myFolder/applicationAuthenticator.sh' >> ~/.bashrc
        echo "success" > $pipe
        exit
    fi
fi

ВТОРОЙ КОМПЛЕКТ ФАЙЛОВ

скрипт ".profile"

# .bash_profile
umask 022
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Скрипт ".bashrc"

/myFolder/backgroundTask2.sh &
/myFolder/applicationAuthenticator.sh

скрипт backgroundTask2.sh

pipe=/myFolder/testpipe2
if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi

while true
do
    ## Do some status LED blinking task here
done &

while true
do
    if read line < $pipe; then
        if [[ "$line" == 'success' ]]; then
           ## Kill the background LED blinking task created in the above while loop
           kill $!
           rm $pipe
           exit
        elif [[ "$line" == 'failed' ]]; then
           kill $!
           rm $pipe
           exit
        fi
    fi
done

скрипт applicationAuthenticator.sh

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, КАК Я ИЗМЕНИВАЮ BASHRC, ЧТОБЫ ЗАПУСК НОРМАЛЬНО С СЛЕДУЮЩЕЙ ПЕРЕЗАГРУЗКИ НА КОНЕЦ ЭТОГО СКРИПТА

#!/bin/bash
## Named pipe location for communicating to backgroundTask2
pipe=/myFolder/testpipe2

response=$(curl https://myProduct/myCustomAPI.com \
           --cert /anotherFoler/myCert.crt --key /anotherFolder/myKey.key \
           -H 'Content-Type: application/x-www-form-urlencoded; charset=utf-8' \
           -d 'data=xxx')
if [[ $response == 204 ]; then
    echo '' > ~/.bashrc
    echo "success" > $pipe
    exit
else
    echo "failed" > $pipe
    exit
fi

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

Чтобы убедиться, что они существуют до перезагрузки, я захожу в папку "/ anotherFolder" и проверяю файлы физически. У них есть полный ключ и сертификат перед перезагрузкой. Когда я перезагружаюсь и вижу, что скрипт завершается ошибкой, те же файлы ключей и сертификатов (которые имели реальные данные до перезагрузки) теперь имеют значения NULL.

Ответы на вопрос(0)

Ваш ответ на вопрос