마스터 사용자가 세션을 진행하고 관찰자가 세션에 대한 읽기 전용 액세스 권한을 가지도록 Linux 사용자 ID에서 tmux 세션을 공유하는 도구를 작성했습니다. 두 부분이 있습니다 : 내 프로세스가 tty와 관련성이없는 이유는 무엇입니까?
문제가
- 스크립트 명명 된 세션을 관찰자의 UID하여 마스터 UID와 setuid를 실행하는
- AC 프로그램을 시작합니다 대화 형 쉘은 그 시작하면 그 관찰자 프로세스가 종료되면 관찰자가 죽습니다. 나는 자식 프로세스를 적절히 대몬화함으로써 이것을 막으려 고 노력했지만 작동하지 않는다. (코드를 보라). SIG_IGN을 사용하여 unsuccessgully를 실험 한 다음 해당 코드를 제거했습니다.
1 부, 마스터 세션 시작 스크립트 :
:#!/usr/bin/env bash sessionName=${1:-shared} me=`id -ru` socket=/tmp/tms-$me-shared tmux -S $socket new-session -s $sessionName # Use companion setuid pgm to start slaves... # tmux-slave [sessionName]
2 부 마스터로 setuid를 실행하는 관찰자의 C 코드는 여기
코드입니다#include <stdio.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <fcntl.h> int main (int argc, char *argv[]) { char *alist[] = { "xterm","-e","/usr/bin/tmux", 0 }; int me = geteuid(); char tmuxCmd[200]; char sessionName[10] = "shared"; if (argc > 1) { strncpy(sessionName,argv[1],9); sessionName[10] = '\0'; } sprintf(tmuxCmd,"/usr/bin/tmux -S /tmp/tms-%d-shared att -t %s -r",me,sessionName); alist[2] = tmuxCmd; printf("\nppid/pid/sid/pgid: %d/%d/%d/%d\n",getppid(),getpid(),getsid(0),getpgrp()); int fc; if (!(fc = fork())) { // child int sid = setsid(); // put child in independent session setpgrp(); printf("New ppid/pid/session/pgrp is %d/%d/%d/%d\n",getppid(),getpid(),sid,getpgrp()); close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); if (fork() > 0) exit(0); // spawn child in new session execv("/usr/bin/xterm",alist); printf("Failed to invoke tmux in xterm\n"); exit(-1); } // parent printf("Child PID from first fork(): %d\n",fc); if (fc == -1) { printf("fork() failed for slave\n"); exit(-2); } printf("Slave spawned from %d\n",getpid()); exit(0); }
컴파일 :
[email protected]:~/Desktop/u/src$ cc -o tmux-slave tmux-slave.c; chmod u+s tmux-slave
[email protected]:~/Desktop$ tmux-share cherry # master session
과 :
등이 실행
[email protected]:~$ /home/bill/Desktop/u/src/tmux-slave cherry
후, 모든 것이 괜찮 신디는 쉘을 종료 할 때까지. 멈췄다. Ctl-C는 exit를 발생 시키지만 child (관측기 xterm/tmux)는 종료됩니다. nohup을 사용하지 않고 시작된 프로세스와 비슷합니다. 나는 setsid()가 이것을 처리 할 것이라고 생각했다. 명백하게.
Eh?
추가 작업 : 마스터와 관찰자가 동일한 uid 인 경우 코드가 문제를 나타내지 않습니다. FWIW! –
따라하기, 후속 조치 ... 문제는 코드와 관련이없는 것 같습니다. 내 테스트 케이스에서, 나는 ssh 터널링에 의존했다. 따라서 호출하는 쉘을 죽이면 xterm을 활성 상태로 유지하는 데 필요한 터널이 파괴되었습니다. 이봐. 이 문제를 닫으십시오. 코드를 읽는 데 시간을 낭비하는 사람에게는 사과드립니다. 그러나 당신은 tmux와 함께 아이디어를 사용할 수 있습니다! –