su -c를 사용할 때 오류 발생: bash: 이 셸에는 작업 제어가 없습니다.

su -c를 사용할 때 오류 발생: bash: 이 셸에는 작업 제어가 없습니다.

다른 사용자로서 특정 명령을 실행하고 실행이 완료된 후(성공 또는 실패) 즉시 로그아웃해야 하는 스크립트를 작성했습니다.

-c명령을 실행하는 데 of를 사용할 수 있다는 것을 읽었습니다 su. 그래서 다음과 같은 스크립트를 작성했습니다.

#!/usr/bin/env bash

su - user2 -c "echo 'hurray' && exit"

명령 을 실행 echo하지만 로그아웃하지 않으므로 로그인 상태를 유지합니다 user2. logout대신 사용하려고 시도했지만 로그인 상태가 유지됩니다. 명령을 호출 하고 실행하는 exit스크립트를 실행해야 하며 완료 후 컨트롤이 반환되어야 합니다 .user1suuser2user1

업데이트

네, 자동으로 로그아웃할 수 있도록 했는데 이번에는 일부 명령이 실행되지 않습니다. 예를 들어:

명령1:

su user2 -c 'echo 1'

출력1:

1

그리고 자체적으로 로그아웃됩니다.

명령2:

su user2 -c 'bash some-script.sh'

출력2:

bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell

-c따라서 of 를 통해 일부 스크립트를 실행하려고 할 때마다 su위에서 언급한 오류가 표시됩니다. , , , 등 -c의 옵션을 사용하여 많은 명령을 시도했습니다. 이러한 명령은 모두 올바른 출력을 생성했습니다. 그러나 스크립트를 실행하려고 시도하는 모든 명령은 오류와 함께 실패합니다.lswhichbash --versionmkdirrmwhoami

su user2 -c 'bash --version'      # Works
su user2 -c 'bash some-script.sh' # Doesn't work

왜 이런 일이 발생하는지 알 수 없습니다. 그리고 이것이 제가 이 오류를 고칠 수 없는 이유이기도 합니다.

답변1

이 동작의 이유는 최신 버전의 매뉴얼 페이지에 설명되어 있습니다 su.

-c, --명령 명령

를 사용하여 셸에서 호출할 명령을 지정합니다 -c.

실행된 명령은제어 터미널이 없습니다. 이 옵션은 TTY 제어가 필요한 대화형 프로그램을 실행하는 데 사용할 수 없습니다.

(강조는 내 것)


ls, echo또는 와 같은 기본 명령을 실행하면 제어 터미널 없이도 bash --version단순히 출력을 스트림에 인쇄합니다 .stdout

나는 그 방법이 bash(대화 형 셸로) 호출되거나 some-script.sh제어 터미널 장치가 필요한 명령을 포함하여 실행하면 오류가 'bash some-script.sh'발생한다고 의심합니다 cannot set terminal process group (-1): Inappropriate ioctl for device.

몇 가지 설명

터미널 제어프로세스의 경우 프로세스가 시작된 터미널 장치입니다. 제어 터미널은 프로세스 그룹에 신호를 보낼 수 있으며 Unix 운영 체제에서 작업 제어가 작동하는 메커니즘입니다. 작업 제어를 통해 프로세스 그룹의 프로세스가 전경 또는 배경에서 실행될 수 있습니다.

명령 의 출력에는 ps각 프로세스에 대한 제어 터미널이 표시됩니다. 예:

$ ps

  PID TTY          TIME CMD
 3614 pts/5    00:00:00 bash
31628 pts/5    00:00:00 ps

su의 최근 변화

과거에는 su -c대화형 쉘을 실행하지 않을 때 제어 터미널을 시작했습니다. Ubuntu 시스템에서 실행하면 apt-get changelog login보안 조치로 2012년 5월에 제어 터미널 제거가 도입되었음을 알 수 있습니다.

  • su: 명령을 실행할 때 제어 터미널을 삭제하여 가능한 tty 하이재킹을 수정합니다(CVE-2005-4890). 종료: #628843

관련 정보