SSH가 종료되기 전에 SSH를 통해 서버에서 "예약된"/지연된 스크립트를 sudo로 실행합니다.

SSH가 종료되기 전에 SSH를 통해 서버에서 "예약된"/지연된 스크립트를 sudo로 실행합니다.

이것은 대답될 수 있다SSH를 통해 스크립트를 계속 실행하세요., 슈퍼유저로 명령을 실행할 필요가 없는 경우. 예를 들어 보겠습니다. 내 서버에 다음 스크립트 ~/testsleep.sh도 있다고 가정해 보겠습니다 chmod +x.

#!/usr/bin/env bash

logger Pre sleep: "$USER" / "$USERNAME" / "$1"

sleep 5

logger Post sleep: "$USER" / "$USERNAME" / "$1"

stdout/stderr이 손실될 수 있으므로 로그인 logger하고 싶습니다 ./var/log/syslogssh

ssh로컬 PC에서 이 프로그램을 실행하고 원격 서버를 통해 로그인한다고 가정해 보겠습니다.

server$ readlink -f ~/testsleep.sh 
/home/user/testsleep.sh

server$ $ ls -la testsleep.sh 
-rwxr-xr-x 1 user user 126 2015-02-05 13:35 testsleep.sh

server$ sudo /home/user/testsleep.sh some_argument
sudo: unable to execute /home/user/testsleep.sh: No such file or directory

sudo첫 번째 문제는 다음을 사용하여 스크립트를 직접 실행할 수 없다는 것입니다.현재 쉘이 일반 사용자 ID로 실행 중이며 루트 액세스 권한을 부여할 수 없습니다."sudoPermissions_shell_Stack을 사용하여 현재 쉘에서 쉘 스크립트 실행

알았어, 알았어, 달려갈게 sudo bash. 그러면 다음과 같이 보일 거야.

server$ sudo bash /home/user/testsleep.sh some_argument

server$ tail -2 /var/log/syslog
Feb  5 13:40:48 user user: Pre sleep: root / root / some_argument
Feb  5 13:40:53 user user: Post sleep: root / root / some_argument

분명히 스크립트가 로그인 하고 예상 대로 syslog표시됩니다 . 여태까지는 그런대로 잘됐다.root$USER

ssh이제 터미널 세션을 종료하기 전에 이 스크립트를 서버의 프로세스로 실행하고 싶습니다 . 나는 이렇게 할 것 같아요:

server$ sudo bash /home/user/testsleep.sh from_end & exit
[1] 6293
logout
Connection to 127.1.100.99 closed.
local$

서버에 다시 로그인하여 syslog다시 확인하면 마지막 "exit" 호출에 로그가 없음을 알 수 있습니다.

# this `grep` will print the filename, if file doesn't contain the match:

server$ grep --files-without-match 'from_end' /var/log/syslog
/var/log/syslog
server$ tail -2 /var/log/syslog
Feb  5 13:40:48 mypc user: Pre sleep: root / root / some_argument
Feb  5 13:40:53 mypc user: Post sleep: root / root / some_argument

그래서 내 질문은 - 이 스크립트를 서버의 sudo에서 프로세스로 실행하는 방법입니다. 그러나 ssh쉘에서 호출하고 종료하기 전에 실행되도록 합니다(이 경우 를 작성하여 확인합니다 syslog).

답변1

disown연결이 "중단"되어도 종료되지 않도록 하려면 다음이 필요합니다 .

sudo bash /home/user/testsleep.sh from_end & sleep 1; disown -h; exit

sleep 1목적은 백그라운드 작업 시작과 셸 종료 간의 경쟁을 줄이는 것입니다. 한 줄에 모든 작업을 수행하지 않으려면 두 명령 세트를 분리하여 더 나은 결과를 얻을 수 있습니다.

sudo bash /home/user/testsleep.sh from_end &
disown -h; exit

관련 정보