추가 읽기

추가 읽기

부팅 시 이메일 터널과 양말 프록시를 자동으로 시작하고 싶습니다. /etc/init.d/email-tunnels내 홈 디렉토리에 있는 다른 스크립트를 호출하는 스크립트가 있습니다 . 시작할 때는 작동하지 않고, 실행하면 작동하지 않지만 sudo service email-tunnels start, 그냥 실행하면 작동합니다 sudo /etc/init.d/email-tunnels start. 그런데, 나는 다른 컴퓨터(Debian 8)에 동일한 설정을 가지고 있는데 그 컴퓨터에서는 매력적으로 작동합니다.

세부 사항은 다음과 같습니다(Ubuntu 18 설정, 작동하지 않는 설정).

[···]$ ls -lh /etc/init.d/email-tunnels 
-rwxr-xr-x 1 root root 602 Aug 28 10:21 /etc/init.d/email-tunnels
[···]$

내용은 다음과 같습니다(일부 디버깅 포함 echo).

[···]$ cat /etc/init.d/email-tunnels 
#! /bin/sh

### BEGIN INIT INFO
# Provides:     email_tunnels
# Required-Start:   $all
# Required-Stop:    $remote_fs $syslog
# Default-Start:    2 3
# Default-Stop:     0 1 6
# Short-Description:    E-mail and HTTP tunnels over SSH
### END INIT INFO

echo "email-tunnels invoked at `date`" >> /tmp/email-tunnels.log

touch /var/lock/email-tunnels

case "$1" in
  start)
    echo "email-tunnels executing 'start' at `date`" >> /tmp/email-tunnels.log
    su -c "/home/cal/bin/email.sh &" cal
    ;;
  stop)
    ;;
  *)
    echo "Usage: /etc/init/email-tunnels {start|stop}"
    exit 1
    ;;
esac

exit 0

그런 다음 내 홈 디렉터리의 스크립트는 다음과 같습니다.

[···]$ ls -lh /home/cal/bin/email.sh 
-rwxr-xr-x 1 cal cal 410 Aug 28 10:09 /home/cal/bin/email.sh
[···]$ 

그리고 그 내용은 다음과 같습니다:

[···]$ cat /home/cal/bin/email.sh 
#!/bin/bash

echo "email.sh executed at `date`" >> /tmp/email.log
sleep 30

while [ "1" == "1" ]
do
    echo "email.sh about to execute ssh at `date`" >> /tmp/email.log
    ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25 [email protected]
    sleep 120
done

내 대상(서버) 시스템의 터널 사용자는 사용자 상호 작용 없이(비밀번호를 제공할 필요 없음) SSH를 사용할 수 있도록 올바르게 구성된 PK 인증을 가지고 있습니다.

왜 작동하지 않는지 아시나요? 디버그 출력에서 ​​init.d 스크립트(email-tunnels)가 실행되는 것을 볼 수 있지만(/tmp/email-tunnels.log에서 출력을 볼 수 있음) /home/cal/bin/email.sh는 실행되지 않습니다. - -- 수동으로 실행하면 /etc/init.d/email-tunnels start/tmp/email.log 디버그 출력이 표시되며, 이 시점에서는 실행 후 터널이 제대로 작동합니다.

답변1

귀하는 2016년부터 시스템화된 OS, 2006년부터 Upstart OS인 Ubuntu Linux를 사용하고 있습니다. van Smoorenburg rc스크립트의 경우는 그렇지 않습니다. 특히 새로운 경우에는 더욱 그렇습니다.

특히 이 경우. 거의 후보네요공포의 집. 시스템에서 결과 서비스 단위는 스크립트를 해석하기 위한 프로세스를 실행하고 있습니다. 이 프로세스는 실행할 프로세스를 포크하고 su(권한을 제거하기 위해 해당 프로세스를 남용), 쉘을 실행하기 위한 프로세스를 포크하고, 다른 스크립트를 해석하기 위해 프로세스를 포크합니다. 가난한 사람의 데몬 감독자를 무한 루프로 실행하여 계속해서 분기합니다 ssh.

그리고 이 모든 것은 서비스 관리자가 할 수 있는 일을 하기 위한 것입니다.그래도: 특정 사용자로 특정 프로그램을 실행하고 종료할 때마다 다시 시작합니다.

journalctl -b로그를 읽고 다음과 같은 매우 간단한 기반을 구축하는 방법을 알아보세요 .

# /etc/systemd/system/email_tunnels.service
[단위]
Description=SSH를 통한 이메일 및 HTTP 터널링
문서=https://unix.stackexchange.com/a/465353/5132

[제공하다]
사용자=cal
유형=단순
ExecStart=/usr/bin/ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25[이메일 보호됨]
재시작 초=120

[설치하다]
WantedBy=다중 사용자.대상

그런 다음 SSH ID 파일이 포함된 홈 디렉터리를 사용할 수 있게 되면 서비스를 실행해야 합니다. 물론 일부 설정에서는 이것이 사실입니다.로그인 후홈 디렉토리가 자동으로 마운트되고 암호가 해독되었습니다. 이 경우 시스템 수준 서비스를 설정하지 않을 수도 있습니다.별말씀을요대신 처음 로그인할 때 시작되는 각 사용자의 systemd 인스턴스에서 사용자 서비스로 실행하세요.

# /home/cal/.config/systemd/user/email_tunnels.service
[단위]
Description=SSH를 통한 이메일 및 HTTP 터널링
문서=https://unix.stackexchange.com/a/465353/5132

[제공하다]
유형=단순
ExecStart=/usr/bin/ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25[이메일 보호됨]
재시작 초=120

[설치하다]
WantedBy=default.target

물론 이러한 사용자별 서비스를 제어 --user하려면 옵션을 사용하세요.systemctl

추가 읽기

관련 정보