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

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

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

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

#!/usr/bin/env bash

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

명령을 실행 echo하지만 로그인 상태를 유지하고 user2로그아웃하지는 않습니다. logout대신 사용해 보았지만 exit로그인 상태가 유지됩니다. 명령을 user1호출 하여 스크립트를 실행 하고 완료 후 컨트롤이 반환되도록 실행해야 합니다.suuser2user1

고쳐 쓰다

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

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

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

왜 이런 일이 발생하는지 이해하지 못합니다. 이것이 내가 이 오류를 해결할 수 없는 이유이기도 합니다.

답변1

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

-c, --command 명령

쉘에서 사용되도록 지정합니다 -c.

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

(강조는 내 것)


lsecho, 또는 와 같은 기본 명령을 실행하면 제어 터미널이 필요 없이 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 -c대화형 셸을 실행하지 않을 때 제어 터미널이 시작되었습니다. 내 Ubuntu 시스템에서 이를 실행하면 apt-get changelog login2012년 5월에 보안 조치로 제어 터미널 제거가 도입되었음을 알 수 있습니다.

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

관련 정보