다른 사용자로서 특정 명령을 실행하고 실행이 완료되면(성공 또는 실패) 즉시 로그아웃해야 하는 스크립트를 작성했습니다.
-c
명령을 실행하기 위해 of 를 사용할 수 있다는 것을 읽었습니다 su
. 그래서 저는 다음과 같은 스크립트를 작성했습니다.
#!/usr/bin/env bash
su - user2 -c "echo 'hurray' && exit"
명령을 실행 echo
하지만 로그인 상태를 유지하고 user2
로그아웃하지는 않습니다. logout
대신 사용해 보았지만 exit
로그인 상태가 유지됩니다. 명령을 user1
호출 하여 스크립트를 실행 하고 완료 후 컨트롤이 반환되도록 실행해야 합니다.su
user2
user1
고쳐 쓰다
뭐, 자동으로 로그아웃할 수도 있었는데, 이번에는 일부 명령이 실행되지 않았습니다. 예를 들어:
명령 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
같은 옵션을 사용하여 많은 명령을 시도했습니다 . 이 모든 명령은 올바른 출력을 생성했습니다. 그러나 스크립트를 실행하려는 모든 명령은 오류와 함께 실패합니다.ls
which
bash --version
mkdir
rm
whoami
su user2 -c 'bash --version' # Works
su user2 -c 'bash some-script.sh' # Doesn't work
왜 이런 일이 발생하는지 이해하지 못합니다. 이것이 내가 이 오류를 해결할 수 없는 이유이기도 합니다.
답변1
이 동작의 이유는 최신 버전의 매뉴얼 페이지에 설명되어 있습니다 su
.
-c, --command 명령
쉘에서 사용되도록 지정합니다
-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 -c
대화형 셸을 실행하지 않을 때 제어 터미널이 시작되었습니다. 내 Ubuntu 시스템에서 이를 실행하면 apt-get changelog login
2012년 5월에 보안 조치로 제어 터미널 제거가 도입되었음을 알 수 있습니다.
- su: 명령을 실행할 때 제어 터미널을 제거하여 가능한 tty 하이재킹(CVE-2005-4890)을 수정합니다. 닫기: #628843