Bash: "읽기"를 방해하지 않고 백그라운드에서 "sudo -n true"를 실행하는 방법은 무엇입니까?

Bash: "읽기"를 방해하지 않고 백그라운드에서 "sudo -n true"를 실행하는 방법은 무엇입니까?

루트로 실행하고 싶지 않은 장기 실행 Bash 스크립트가 있지만 정기적으로 루트 액세스가 필요합니다. 사용자에게 루트 비밀번호를 요청하여 이 문제를 해결했습니다.

sudo -v

그런 다음 백그라운드에서 다음을 사용하여 sudo 타이머를 반복하고 재설정하는 프로세스를 실행합니다.

sudo -n true

read그런 다음 기본 프로세스에서 사용할 때 이상한 문제가 발생하기 시작했습니다. 다음은 이 문제를 보여주는 최소한의 스크립트입니다. 실행하고 실행하기 전에 아무 것도 입력하지 않으면 sudo -n true읽기에서read error: 0: Resource temporarily unavailable

#!/usr/bin/env bash

sudo -v  # ask user for password

sleep 1 && sudo -n true &  # background a process to reset sudo

printf "Reading text: "
read -n 1 TEXT
echo "Read text: $TEXT"

이 명령을 제외한 다른 명령을 사용하여 이 동작을 복제할 수 없습니다 sudo. sudo -n true방해하지 않고 백그라운드에서 어떻게 실행할 수 있나요 read?

편집하다:

이 문제는 macOS가 아닌 Ubuntu에서만 발생합니다.

답변1

나는 같은 행동을 취합니다.

sleep 1 && true < /dev/tty &
read var

sudobash에 의한 시스템 호출이 EAGAIN으로 반환되도록 /dev/tty하는 현재 포그라운드 프로세스 그룹을 쿼리하기 위해 엽니다 . Ubuntu 18.04의 Linux 커널 4.15.0-45-generic 및 4.18.0-14-generic은 적어도 유틸리티가 다음으로 반환되도록 합니다. 그 오류.read()readread

이로 인해 발생하는 것 같습니다.Linux 커널의 Ubuntu 변형 최신 버전에 있는 버그. 나는 그것을 Solaris와 FreeBSD에서 재현할 수 없으며 어떤 Linux 버전의 Debian에서도 재현할 수 없습니다(비록 우분투 4.18 커널에서 데비안을 부팅하면 재현할 수 있지만).

https://bugs.launchpad.net/ubuntu/+source/linux-signed-hwe/+bug/1815021오류의 또 다른 징후인 것 같습니다.

이는 다음으로 인해 발생합니다.https://lkml.org/lkml/2018/11/1/663우분투는 최소한 4.15 및 4.18 커널로 백포트되었습니다. 하지만 Ubuntu는 백포트되지 않습니다.또 다른 변화수리하다이 패치로 인해 발생하는 회귀~까지2시간 전.

이제 4.18.0-15-generic을 Ubuntu 리포지토리에서 사용할 수 있으며 이 문제가 해결되었습니다. 곧 4.15 버전이 나올 것 같아요.

ksh93read내장 함수는 먼저 select()입력 대기를 사용하고 select()다른 프로세스가 열려 있을 때 반환하지 않기 때문에 동일한 코드에는 문제가 없습니다 /dev/tty.

따라서 여기서 ksh93대신 사용하거나 bash커널이 수정될 때까지 기다리거나 4.15.0-46이 릴리스될 때까지 4.15.0-43으로 돌아갈 수 있습니다.

zsh또는 스크립트를 시작하면 (EUID/UID/USERNAME 특수 변수를 통해) uid 변경에 대한 내장 지원을 사용할 수 있으므로 스크립트 내에서 실행할 root필요가 없습니다 sudo(스크립트 수명 연장). 사용자가 예상하는 것보다 긴 sudo 토큰을 사용하면 잠재적으로 위험할 수도 있습니다).

관련 정보