3

Уже есть похожие вопросы, но я отправляю это, потому что ни один из ответов не работал. Я пишу bash-скрипт для автоматизации установки пакетов pacman и AUR в моей системе Arch. Идея состоит в том, чтобы прочитать файл (myfile) с именами пакетов сначала построчно, а затем слово за словом и выполнить установку для каждого слова. Это хорошо работает для pacman, но не для AUR Helper (aurman). Часть для Аурмана выглядит так:

while read line; do
if [[ "$line" =~ \$[[:space:]]aurman[[:space:]]-S[[:space:]][[:alnum:]]* ]]
then
    aurline=$(echo "$line" | awk '{ $1=""; $2=""; $3=""; print}' | sed 's/^ *//')
    for aurpkg in $aurline
    do
       sudo -u "${my_user}" bash << EOF
aurman -S --noconfirm --needed --noedit "$aurpkg"
wait
EOF
    done
fi
done < "$myfile"

С опциями --noconfirm --needed --noedit aurman не запрашивает у меня Да / Нет, но для некоторых пакетов запрашивает номер. Таким образом, проблема в этом случае - скрипт не ждет, пакет не устанавливается, и aurman выдает ошибку «EOFError: EOF при чтении строки». Я попытался приостановить сценарий следующим образом:

aurman ...
wait

или вот так:

aurman ... &
wait

но ни одна из этих работ.

Итак, как я могу приостановить свой сценарий, когда Аурман запрашивает у меня номер? Каков общий подход в подобных случаях? Как я могу дать ответ для определенного пакета с самого начала, когда я запускаю скрипт (например, 1 для пакета x)?

2 ответа2

4

Основная проблема в том, что stdin (который пытается прочитать aurman ) не приходит от пользователя, он перенаправляется сначала из $myfile , а затем из документа здесь, содержащего команды оболочки для запуска sudo . Один из вариантов - передать эти файлы с помощью другого файлового дескриптора, такого как # 3 (который обычно не используется). Я думаю, что вы также можете упростить его, исключив запуск оболочки под sudo - поскольку вы запускаете aurman на переднем плане, вам не нужно его wait , поэтому вам не нужна оболочка (и, следовательно, не нужна здесь-документ).

while read line <&3; do
    if [[ "$line" =~ \$[[:space:]]aurman[[:space:]]-S[[:space:]][[:alnum:]]* ]]
    then
        aurline=$(echo "$line" | awk '{ $1=""; $2=""; $3=""; print}' | sed 's/^ *//')
        for aurpkg in $aurline
        do
            sudo -u "${my_user}" aurman -S --noconfirm --needed --noedit "$aurpkg"
        done
    fi
done 3< "$myfile"

Если это не сработает и вам действительно нужно запустить оболочку под sudo , вы можете перенаправить ее также через FD # 3, и bash прочитает это как скрипт, например:

            sudo -u "${my_user}" bash /dev/fd/3 3<< EOF
aurman -S --noconfirm --needed --noedit "$aurpkg"
wait
EOF
0

Для bash есть команда sleep , которая переводит скрипт в спящий режим до тех пор, пока не пройдет время в секундах. Однако, если вы хотите перехватить пароль, я бы порекомендовал вам один из двух способов ниже (посмотрите скрипт, который я привел внизу, чтобы проиллюстрировать, как работает режим сна, а также 2 альтернативы, упомянутые ниже).

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

[root@client ~]# cat readPass.sh
#!/bin/bash

# Author: @djcerdas
password="$1"

# Sample sleep command
echo "Hi, I am the PID $$, I am going to sleep 3 seconds"
date&&sleep 3&&date
echo "---------------------------------------"
# Sample method 1: passing password a parameter
echo  "Method 1: The password is $password"
password=""
echo "---------------------------------------"
# Sample method 2: using read
echo "Method 2: Please provide your password:"
read password
echo The password is $password

[root@client ~]# ./readPass.sh myPasswordX
Hi, I am the PID 2257, I am going to sleep 3 seconds
Tue Apr  3 01:17:55 CST 2018
Tue Apr  3 01:17:58 CST 2018
---------------------------------------
Method 1: The password is myPasswordX
---------------------------------------
Method 2: Please provide your password:
myNewPassword
The password is myNewPassword
[root@client ~]#

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .