起動時にメールトンネルと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
[···]$
内容は次のとおりです(一部のデバッグecho
sを含む):
[···]$ 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デバッグ出力が表示されます。さらに言えば、実行後にトンネルが機能します。
あなたは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
に使用して、このようなユーザーごとのサービスを制御します。