bash 스크립트가 사용자 응답을 기다리도록 강제하는 방법은 무엇입니까?


3

이미 비슷한 질문이 있지만 답변이 없기 때문에 게시하고 있습니다. 아치 시스템에 pacman 및 AUR 패키지 설치를 자동화하는 bash 스크립트를 작성 중입니다. 아이디어는 패키지 이름이있는 파일 (myfile)을 한 줄씩 읽은 다음 한 단어 씩 읽고 각 단어마다 설치를 수행하는 것입니다. 이것은 pacman에는 잘 작동하지만 AUR 도우미 (aurman)에는 적합하지 않습니다. 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 : EOFError : EOFError when a line을 읽을 때"오류가 발생합니다. 다음과 같이 스크립트를 일시 중지하려고했습니다.

aurman ...
wait

또는 이와 같이 :

aurman ... &
wait

그러나 이들 중 어느 것도 작동하지 않습니다.

aurman이 전화 번호를 물을 때 어떻게 스크립트를 일시 중지시킬 수 있습니까? 이런 경우 일반적인 접근 방식은 무엇입니까? 스크립트를 실행할 때 처음부터 특정 패키지에 대해 어떻게 대답 할 수 있습니까 (예 : 패키지 x의 경우 1)?


aurman모르겠지만 어쩌면 expect필요한 도구 일 것 입니다. 참조 man 1 expect이 대답 .
Kamil Maciorowski

답변:


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"

그래도 작동하지 않고 실제로 쉘을 실행 해야하는 경우 sudoFD # 3을 통해 리디렉션 bash하고 스크립트를 다음과 같이 읽을 수 있습니다.

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

0

bash에는 sleep 명령이 있는데,이 명령은 초 단위 시간이 지날 때까지 스크립트를 휴면 상태로 만듭니다. 그러나 원하는 것이 암호를 잡는 것이라면 아래 두 가지 방법 중 하나를 사용하는 것이 좋습니다 (아래에 넣은 스크립트를 확인하고 수면 작동 방식 및 아래 언급 된 두 가지 대안을 설명하십시오).

  • 스크립트를 시작할 때 비밀번호를 매개 변수로 보낼 수 있습니다.
  • read 명령을 사용할 수 있습니다 . 고객이 Enter 키를 누를 때까지 입력을 기록합니다.

[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 ~]#

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.