
私はラップトップを持っています。自宅で作業するときは、一部のサーバーにSSHトンネルを設定します。トンネルは自動的に開始され、エラーが発生した場合に再起動されるシステムサービスとして実装されます。
現在は、ノートパソコンをオフィスに持ち込むとトンネルも設置されています。私の場所に基づいてトンネルサービスの開始を決定する方法はありますか?場所は私のIPアドレスに基づいているか、サーバーをpingできるかどうかに基づいています。
オフィスではなく家にいるときにのみトンネルを設定する最良の方法は何ですか?
答え1
man systemd.unit
多数の条件と主張が定義されています。
2つのデバイスを実行できますsystemd
。
- Aは
Type=oneshot
スクリプトを実行し、結果に従ってファイルを生成します。スクリプトは、SSID、デフォルトパス、IPアドレス、またはその他の意味のあるすべてのエントリを確認できます。 - 基本的なトンネルサービスは、
Condition...=
このファイルとのAfter=
関係に基づいています。
たとえば、
[Unit]
Description=Checking for ssid
[Service]
Type=oneshot
ExecStart=-/bin/bash -c "touch %t/$(/usr/sbin/iwgetid -r).ssid"
それから
[Unit]
Description=VPN Tunnel
After=ssid.service
ConditionPathExists=%t/AtHome.ssid
[Service]
...
チェックはCondition...=
起動時にのみ実行されます。したがって、コンピュータがその場所から起動した場合にのみ機能します。%t
再起動すると常に消去されるため、ファイルを入れておきました。
再起動せずに動作するには、最初の条件をポーリングし、ファイルが存在しない場合は競合するサービスを開始するための一種のタイマーが必要です。これによりトンネルサービスが停止します。
より簡単な解決策は、以下を使用するのと同じかもしれませんExecStartPre=
。Restart=on-failure
[Unit]
Description=VPN Tunnel
[Service]
ExecStartPre=/bin/bash -c "test $(/usr/sbin/iwgetid -r) = MyHome"
Restart=on-failure
RestartSec=2m
...
SSIDが「MyHome」と一致することを確認してください。成功すると、残りのサービスが実行されます。失敗した場合はしばらくしてからやり直してくださいRestartSec=
(デフォルトは100msですが、速すぎてここでは5mに設定しました)。
現在のソリューションが失敗した場合はすでに再起動されているため、ソリューションが破損する可能性があり、これは最初のソリューションがより良い可能性があることを意味します。また、systemctl status
家庭用WiFiを使用していない場合は、システムがダウングレードされているとマークされます。