web-dev-qa-db-ja.com

ユーザーのディレクトリでスクリプトを呼び出すinitスクリプト-機能しない(Ubuntu 18.04)

起動時にメールトンネルとSocksプロキシを自動的に開始したい。ホームディレクトリの下に別のスクリプトを呼び出す/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
[···]$

内容は次のとおりです(一部のデバッグechosを含む):

[···]$ 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

ターゲット(サーバー)マシンのトンネルユーザーにはPK認証が適切に構成されているため、ユーザーの操作なしで(パスワードを入力しなくても)ssh接続できます。

それが機能しない理由はありますか?デバッグ出力から、init.dスクリプト(email-tunnels)が実行されていることがわかります(出力は/tmp/email-tunnels.logにあります)が、/ home/cal/bin /email.shでは実行されていません- -手動で/etc/init.d/email-tunnels startを実行すると、/ tmp/email.logデバッグ出力が表示されます。さらに言えば、実行後にトンネルが機能します。

1
Cal-linux

あなたはUbuntuLinuxを使用しています。これは、2016年からsystemdオペレーティングシステムであり、2006年から10年前はUpstartオペレーティングシステムでした。vanSmoorenburgrcスクリプトは、特に新しい場合は方法ではありません。もの。

そして特にこの場合。これはほとんどHouse of Horrorの候補です。システム上で、生成されたサービスユニットは、スクリプトを解釈するプロセスを実行しています。このプロセスは、suを実行するプロセスをフォークし(特権を削除するためにそれを悪用します)、シェルを実行するプロセスをフォークし、 sshを繰り返しフォークする無限ループPoorMan'sDæmonSupervisorを実行する別のスクリプトを解釈します。

そして、これはすべて、サービスマネージャが実行できることを実行するためだけですとにかく:特定のプログラムを特定のユーザーとして実行し、終了するたびに再起動します。

ログを読むためのjournalctl -bを学び、このかなり単純な基礎に基づいて構築します。

#/ etc/systemd/system/email_tunnels.service 
 [Unit] 
 Description = SSH経由の電子メールとHTTPトンネル
 Documentation = https:// unix.stackexchange.com/a/465353/5132

[Service]
User=cal
Type=simple
ExecStart=/usr/ bin/ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25 [email protected] 
 RestartSec = 120 
 
 [インストール] 
 WantedBy = multi-user.target 

次に、SSHIDファイルを含むホームディレクトリが使用可能になった後でこのサービスが実行されることを確認する必要があります。もちろん、一部の設定では、これはケースのみですログイン後そしてホームディレクトリは自動マウント、復号化などされています。この場合、システムレベルのサービスを設定しない方がよいでしょうまったく代わりに、最初のログイン時に開始されるsystemdのユーザーごとのインスタンスの下でユーザーサービスとしてこれを実行します。

#/ home/cal/.config/systemd/user/email_tunnels.service 
 [Unit] 
 Description = SSH経由のEメールおよびHTTPトンネル
ドキュメント= https://unix.stackexchange.com/a/465353/5132

[Service]
Type = simple 
 ExecStart =/usr/bin/ssh -N -D5080 -Llocalhost:10110:xx.xx.xx.xx:110 -Llocalhost:10025:xx.xx.xx.xx:25 [email protected] 
 RestartSec = 120 
 
 [インストール] 
 WantedBy = default.target 

もちろん、--userオプションをsystemctlに使用して、このようなユーザーごとのサービスを制御します。

参考文献

3
JdeBP