2015-01-15 3 views
0

마스터 사용자가 세션을 진행하고 관찰자가 세션에 대한 읽기 전용 액세스 권한을 가지도록 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?

+0

추가 작업 : 마스터와 관찰자가 동일한 uid 인 경우 코드가 문제를 나타내지 않습니다. FWIW! –

+0

따라하기, 후속 조치 ... 문제는 코드와 관련이없는 것 같습니다. 내 테스트 케이스에서, 나는 ssh 터널링에 의존했다. 따라서 호출하는 쉘을 죽이면 xterm을 활성 상태로 유지하는 데 필요한 터널이 파괴되었습니다. 이봐. 이 문제를 닫으십시오. 코드를 읽는 데 시간을 낭비하는 사람에게는 사과드립니다. 그러나 당신은 tmux와 함께 아이디어를 사용할 수 있습니다! –

답변

0

내 자신의 질문에 답하기 - 이것을 표시하려고 시도하는 것이 좋습니다.

코드에 문제가 없습니다. 문제는 환경에있었습니다. 나는 쉘을 닫을 때 파괴 된 ssh 터널에 의존했다. 바보 나.

그래서 이것을 어떻게 표시합니까?

+1

사실 질문 자체를 삭제할 수 있습니다. –

관련 문제