루트없이“스크린이 종료됩니다”라는 이유는 무엇입니까?


23

Fedora 19에 화면을 설치했습니다. SSH를 통해 원격으로 루트로 명령을 테스트하면 완벽하게 작동합니다. 예를 들어, screen새 터미널을 입력 하면 에뮬레이터가 시작되고 명령을 기다립니다. 분리 할 수 ​​있습니다. 그러나 표준 사용자로 SSH를 통해 원격으로 로그인 한 후에도 동일한 작업을 시도하면 명령이 즉시 종료됩니다. 내가 볼 수있는 유일한 메시지는 [screen is terminating]입니다.

누군가 이미이 문제를 겪었습니까? 잘못된 권한과 관련이 있습니까?

최신 정보:

$ strace -e trace=file screen
execve("/usr/bin/screen", ["screen"], [/* 23 vars */]) = 0
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libutempter.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libcrypt.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libpam.so.0", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libfreebl3.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libaudit.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
access("/home/steam/.nethackrc", F_OK)  = -1 ENOENT (No such file or directory)
readlink("/proc/self/fd/0", "/dev/pts/0", 4095) = 10
stat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
lstat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/var/run/utmp", O_RDONLY)         = 3
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/shadow", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
readlink("/proc/self/fd/0", "/dev/pts/0", 4095) = 10
stat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
stat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
lstat("/dev/pts/0", {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
stat("/var/run/screen", {st_mode=S_IFDIR|0775, st_size=60, ...}) = 0
Directory '/var/run/screen' must have mode 777.
+++ exited with 1 +++

권한을 777로 변경하려고 시도했지만 실행하면 다음과 같은 결과가 나타납니다 screen.

'/ var / run / screen'디렉토리에는 모드 775가 있어야합니다.

따라서 변경 사항을 되돌 렸습니다.


명령은 무엇입니까?
ewwhite

가장 간단한 것 : "스크린". 나는 shelr.tv/records/525179c7966080791000005f

우연히 VPS 또는 호스팅 서버에 있습니까?
ewwhite

호스팅 서버입니다

strace -e trace=file screen파일 액세스에 실패했는지 확인합니다. 또는 tmux해결 방법으로 사용하며 ^ a 대신 ^ b를 사용하는 것을 제외하고 동일하게 작동합니다.
Emmanuel

답변:


5

"필수 모드 777"과 "필수 모드 775"사이의 플립 플롭은에 의해 야기된다 strace.

screen일반적으로 setuid 또는 setgid 프로그램입니다. 소켓 파일을 만들거나 utmp를 수정하는 데 사용되는 추가 권한을 얻습니다.

프로세스가 추적되면 setuid 및 setgid가 비활성화됩니다. 권한이 적은 사용자가 제어하는 ​​추적 프로세스는 추적 된 프로세스를 인계 할 수 있으므로 원래 사용자에게 너무 많은 전원을 공급하지 않도록 추가 권한없이 실행해야합니다.

screen setuid 권한, setgid 권한 중 어느 것으로 실행되는지 감지하고 이에 따라 디렉토리 권한에 대한 기대 값을 조정합니다.

따라서 이것은 쉽게 디버깅 할 수없는 일련의 문제를 만듭니다 strace.

그러나 근본이라면 해결 방법이 있습니다! 추적 프로세스가 루트로 실행중인 경우 추적 된 프로세스는 정상적으로 특권을 얻을 수 있습니다. 그래서 당신이하는 일이 있습니다 :

  1. 2 개의 새로운 터미널 열기
  2. 첫 번째 터미널에서 루트로 원격 시스템에 로그인하십시오.
  3. 두 번째 터미널에서 일반 사용자로 원격 시스템에 로그인하십시오.
  4. ps두 번째 터미널에서 일반 사용자 쉘 프로세스의 PID를 가져 오는 데 사용
  5. 첫 번째 터미널에서 strace -f -p SHELLPID
  6. 두 번째 터미널에서 화면을 실행하고 실패한 것을 확인하십시오.
  7. 첫 번째 터미널에는 이제 실제로 무엇이 잘못되었는지 확인하는 데 필요한 strace 로그가 있습니다.

strace명령 의 주요 추가 사항은 -f하위 프로세스를 추적하도록 지시 하는 옵션입니다. 로 지정한 쉘 프로세스의 자식이 될 화면을 추적하기 위해 필요합니다 -p.

또한에서와 같이 -ff출력 파일 을 사용 하고 지정하고 싶습니다 -o.

strace -ff -o /tmp/screentrace -p SHELLPID

하위 프로세스마다 별도의 출력 파일이 생성됩니다. 나중에 당신이 함께 읽고 less /tmp/screentrace*결과는 일반적으로 당신이 하나를 사용하는 것보다 깨끗 -f합니다.

최신 정보

strace 출력을 보았으므로 무엇이 잘못되었는지 정확히 알지 못하지만이 줄은 추적에서 가장 놀라운 것입니다.

chown("/dev/pts/2", 1002, 5)            = -1 EPERM (Operation not permitted)

몇 줄 더 일찍, 그것은 pty를 만들었고, 이것은 TIOCGPTN2 번 으로 밝혀졌습니다 .

open("/dev/ptmx", O_RDWR)               = 5
...
ioctl(5, TIOCGPTN, [2])                 = 0
stat("/dev/pts/2", {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 2), ...}) = 0

그러나 그것을 질식시킬 수 없었습니다. 그 chown이 실패하는 이유를 모르겠지만 chown 실패는 화면이 포기 된 그럴듯한 이유를 제공합니다. -vstrace 옵션 에 추가 하고 항목 을 소유 한 사람을 확인한 stat후를 살펴보면 약간 더 많은 정보를 얻을 수 있습니다 .TIOCGPTN/dev/pts/


자세한 절차에 감사드립니다. strace에서 생성 된 출력을 보려고했지만 잘못된 내용을 알 수 없습니다. 다음은 strace에 의해 생성 된 세 파일의 내용과의 링크입니다. pastebin.com/raw.php?i=aeqDwTBX 모든 아이디어를 환영합니다 :)
Laurent

2

해당 버그에 대한 가능한 이유-잘못된 selinux 정책이지만 redhat bugtracker에 따르면 이러한 오류는 fedora 17/18에서 수정되었습니다.

으로는 변수를 변경할 수 있습니다 해결 SCREENDIR당신을 ~/.bashrc같은 것으로 $HOME/.screen.


시도했지만 문제가 해결되지 않습니다.
Laurent

1

이 오류 메시지가 나타 났을 때 다음과 같이 권한을 조정해야했습니다.

chmod 2775 /usr/bin/screen

그리고 이것은 나를 위해 문제를 해결했습니다. 2는 올바른 액세스 권한에 매우 중요합니다.

SUID, SGID, Sticky Bit, ACL 및 액세스에 미치는 영향에 대해 자세히 읽어보십시오.


당신은 작동합니다. 좋지는 않지만 현재 다른 솔루션을 볼 수 없습니다.
Antti Rytsölä Circles 문의하십시오

0

화면 명령이 이미 실행 중입니다. 그래서 나는 그것을 끝내고 명령을 다시 입력했습니다. 예, 이것은 다른 사람들처럼 꽤 좋은 해결책은 아니지만 시간이 덜 걸립니다.

그냥 ps를 찾고 pid를 찾고 PID를 죽인 다음 화면 명령을 다시 입력하십시오.

여러 화면 명령을 실행중인 경우 터미널과 관련된 올바른 프로세스를 종료해야합니다.


0

이 문제는 / etc / fstab에서 다음 줄을 주석 처리하고 재부팅 한 후에 해결되었습니다.

devpts         /dev/pts        devpts  defaults        0       0

0

다른 사람 screen이 해당 장치를 사용하고 있지 않은지 확인하십시오

이것은 /superuser/97844/how-can-i-determine-what-process-has-a-file-open-in-linux 로 얻을 수 있습니다 .

sudo lsof /dev/ttyS0

그런 경우 해당 프로세스를 종료하십시오.

어떤 이유로 든이 조건에서 sudo screen여전히 장치에 액세스 할 수 있지만 해당 연결에서 다른 문자에 의해 소비되는 문자가 누락됩니다 screen.

사용자에게 파일에 대한 읽기 및 쓰기 권한이 있는지 확인하십시오.

예를 들어 Ubuntu에서 사용자를 dialout그룹 에 추가하려고합니다 : /ubuntu//a/133244/52975


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