web-dev-qa-db-ja.com

スクリプトでバックグラウンドでrootとしてOpenVPNを実行するにはどうすればよいですか?

最初にopenvpnを呼び出し、次にsshを呼び出すスクリプトを作成したいと思います。コマンドを入力するとき

Sudo openvpn ~/my_connection.ovpn

コマンドプロンプトで次の出力を取得します:

...
Wed Jan  4 21:04:35 2017 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Jan  4 21:04:35 2017 /sbin/ip link set dev tun0 up mtu 1500
Wed Jan  4 21:04:35 2017 /sbin/ip addr add dev tun0 local IP_FOO peer IP_FOO
Wed Jan  4 21:04:35 2017 Initialization Sequence Completed

このコマンドはブロックされており、シェルはリリースされていません。後でssh接続を開始するには、次のように入力してopenvpnプロセスをバックグラウンドにプッシュする必要があります。 Ctrl+Z bgが続きます。

ただし、bashファイルだけを呼び出すことにより、openvpn接続ステップとsshを自動的に呼び出したいと思います。どのようにエミュレートするのですか Ctrl+Z このファイル内のbgステップ?

&openvpnコマンドに追加し、その前にNohupを配置しようとしました。どちらも動作しません。

20
null

TL; DR:Sudo -bを使用するか、openvpn [...] --daemon.を使用する

openvpnを実行しているため(そして、それほど具体的ではなく、プログラムas rootをバックグラウンドで実行するため)、バックグラウンドでコマンドを実行する方法に関する最も一般的な情報はありませんあなたの状況に対処してください。あなたが言った:

Cpenvpnコマンドに&を追加し、その前にnohopを配置しようとしました。両方とも機能しません。

あなたのコマンドは:

Sudo openvpn ~/my_connection.ovpn

Sudoのデフォルト設定では、同じコンテキストでSudoのパスワードを最近入力していない場合(インタラクティブな使用、通常これは同じ端末を意味します)、パスワードを要求します。ただし、&を追加してコマンドをバックグラウンドで実行すると、[Sudo] password for user:行が表示されず、入力する機会も与えられません。

そのため、この状況では、コマンドを実行し、パスワードを入力し、その後パスワードをバックグラウンドに送信するのが合理的な方法です。forInteractive use

しかし、それが唯一の方法ではなく、あなたが言うように、あなたはそれをin scriptにしたくないでしょう。

Way 1:Sudoに新しいタイムスタンプがあることを確認します。

最初に実行することにより、Sudoがコマンドの実行に使用されるときに現在のタイムスタンプを持つことを確認できます。

Sudo -v

次に、その後、次を実行できます。

Sudo openvpn ~/my_connection.ovpn &

ただし、Nohupを使用してバックグラウンドでコマンドを実行する場合は、通常&(およびSudo)を完全に回避することをお勧めします。これは特にスクリプトの場合です。

Way 2:Sudo -bを使用します。一般に、これは通常あなたが望むものです。

代わりに、Sudo自体をフォアグラウンドで実行できますが、-bフラグを渡すと、Sudoによってコマンドがバックグラウンドで実行されます。

Sudo -b openvpn ~/my_connection.ovpn

これは通常、特にコマンドをスクリプトに配置する場合に適した方法です。 Sudo -bを使用すると、 ジョブ制御 を取得できませんが、 シェルスクリプトでは、ジョブ制御はデフォルトで無効になっているため、通常は使用しないでください

man Sudo の説明:

-b, --background
                 Run the given command in the background.  Note that it is not
                 possible to use Shell job control to manipulate background
                 processes started by Sudo.  Most interactive commands will
                 fail to work properly in background mode.

これは、afterがパスワードを受け取り(必要な場合)、コマンドの実行が許可されていると判断されるまで、バックグラウンドで何も実行されないためです。

Way 3:ただし、openvpnの場合は、おそらく--daemonで実行する必要があります。

--daemonオプションを指定して実行すると、openvpnはバックグラウンドで自動的に実行されます。

Sudo openvpn ~/my_connection.ovpn --daemon

--daemonを前ではなく.opvnファイル名の後に渡します。 --daemonに続く引数は、もしあれば、デーモン化されたopenvpnプロセスが使用すべき名前として解釈されます。 (not&を追加します。)

これが適切かどうかは、openvpnが実行された後、デーモン化される前に相互作用が発生するかどうかによって決まります。そしてthatは、部分的に~/my_connection.ovpnで設定されているものに依存します。しかし、openvpnがすぐにデーモン化できなかった場合、バックグラウンドですぐに実行する他のすべての方法も壊れます

したがって、openvpnをバックグラウンドでstartに実行する必要があり、フォアグラウンドに戻す必要がないことがわかっている状況では、次の方法を強く検討する必要があります。 --daemonオプションを使用して呼び出します。これはopenvpnに固有です。ほとんどのプログラムは--daemonオプションをサポートしていませんが、多くのサーバープログラムにはそのようなオプションがあります。 (ただし、名前と構文は異なります。)

このオプションを使用するかどうか(および使用方法)を決定するには、特に--daemonのセクションで openvpnマニュアルページ を読むことをお勧めします。これには多くの有用な情報があり、ここでは最初の段落のみを引用しています。

--daemon [progname]
              Become  a  daemon  after  all   initialization   functions   are
              completed.   This option will cause all message and error output
              to be sent to  the  syslog  file  (such  as  /var/log/messages),
              except  for  the  output of scripts and ifconfig commands, which
              will go to /dev/null unless otherwise  redirected.   The  syslog
              redirection  occurs  immediately  at  the point that --daemon is
              parsed on the command line even though the  daemonization  point
              occurs  later.   If one of the --log options is present, it will
              supercede syslog redirection.

              The optional progname parameter [...]

Way 4:スクリプト全体をルートとして実行するのが妥当な場合があります。

Rootとして複数のアクションを実行するスクリプトがある場合、rootとしてnotで合理的に実行される重要なアクティビティはなく、スクリプトの実行から得られるものは決してありません非rootユーザーとして、スクリプトのユーザーはおそらく単にrootとして実行する必要があります。

この場合、スクリプトのコマンドからSudoを削除する必要があります。スクリプトがルートとして実行される場合、Sudoは必要ありません。 (デフォルトでは、rootユーザーはSudoを持つ自分自身を含むすべてのユーザーとしてコマンドを実行できますが、そうするためにパスワードは必要ありません。したがって、doSudoのインスタンスを残す場合スクリプトを実行すると、おそらく引き続き動作します。)

スクリプトにSudoのインスタンスがあり、ルート(-u userを使用)以外のユーザーとしてコマンドを実行するために実際に使用されている場合、thoseインスタンスを保持する必要があります。

スクリプト全体をルートとして実行する場合、ほとんどの バックグラウンドでコマンドを実行する一般的な方法 が適用されます。これには、&の追加、および必要に応じてNohupの使用が含まれます)。ただし、このためには、--daemonオプションでopenvpnを使用することを引き続き検討する必要があります。

29
Eliah Kagan

TL; DRデーモンモードで実行:openvpn --config Windscribe-Japan.ovpn --daemon

構成(.ovpn)ファイル名をopenvpnコマンドに渡すことは、他のオプションが指定されていない場合にのみ機能します。 --daemonオプションを指定すると、openvpnはオプションパラメーターとしてファイル名を解析しようとし、オプションエラー:「-Windscribe.ovpn」を--optionパラメーターとして解析しようとしていますが、そうしません」 t先行する「-」を参照してください

回答:

これを回避するには、--configオプションでファイル名を指定する必要があります。たとえば、openvpn --config Windscribe.ovpn --daemon。次に、さらに検査するために、tail -f /var/log/syslogでsyslogを末尾にします。

このcurlコマンドcurl ifconfig.coの出力の前後をチェックして、VPNが接続されていることを確認することもできます。

注:これにより、SSHセッションからログアウトした後でもデーモンが実行され続けます。

2
RajaRaviVarma

あなただけをコピーすることができます

.confファイルを/ etc/openvpn /に

次に、「service openvpn @ confName start」に依頼して、すべてのデーモン化とSudoを処理します。

https://unix.stackexchange.com/a/366680/198666 を参照してください

0
user18099