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


22

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接続を開始するには、Ctrl+にZ続けてbg。を入力してopenvpnプロセスをバックグラウンドにプッシュする必要があります。

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

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


この種の質問は複数回尋ねられました。ヘルプが必要な場合は、スクリプトを投稿する必要があります。
パンサー

sudo -bバックグラウンドでそれに続くコマンドを実行するために使用
ニックシリト

1
これは実際にはその質問の複製ではなく、バックグラウンドプログラムをrootとして実行することはほとんどカバーしておらず、OpenVPNを適切にデーモン化する方法はまったくカバーしていないようです。
エリアケイガン

次に、タイトルを再度変更して、バックグラウンドプログラムをルートとして実行しようとしたことを指摘する必要があります。
nullの

@null要求に応じて、タイトルを再編集しました。OpenVPNはルートとして実行されることが多く、そうでない--daemon場合でもオプションを使用できますが、ルートとして実行することに関する部分この質問の中心であり、タイトルに反映されるべきです。 。これを指摘してくれてありがとう!
エリアケイガン

回答:


35

TL; DR:使用sudo -bや、より良いです、。openvpn [...] --daemon

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

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

あなたのコマンドは:

sudo openvpn ~/my_connection.ovpn

下にsudoあなたが最近のためのパスワードを入力していない場合のデフォルトの設定、sudo(対話的に使用、一般的にこの手段同じ端末用)と同じ文脈で、それはあなたのパスワードを要求します。ただし、バックグラウンドでコマンドを追加して&実行すると、行は表示されず、入力する機会も与えられません。[sudo] password for user:

したがって、この状況では、コマンドを実行し、パスワードを入力し、後でバックグラウンドに送信するのが、インタラクティブな使用のための合理的な方法です。

しかし、それが唯一の方法ではなく、あなたが言うように、あなたはスクリプトでそれをたくないでしょう。

方法1:必ずsudo新しいタイムスタンプを使用してください。

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

sudo -v

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

sudo openvpn ~/my_connection.ovpn &

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

方法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.

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

方法3:しかし、のためにopenvpn、おそらくあなただけでそれを実行する必要があり--daemonます。

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

sudo openvpn ~/my_connection.ovpn --daemon

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

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

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

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

       --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 [...]

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

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

この場合、sudoスクリプトのコマンドから削除する必要があります。スクリプトがルートとして実行される場合、の必要はありませんsudo。(rootユーザーは、デフォルトでは、と自分自身を含む任意のユーザーとして任意のコマンドを実行することができますがsudo及びそうするためのパスワードを必要としません。あなたがもしそうならやるの休暇インスタンスsudoスクリプトでは、それは意志おそらくまだ仕事。)

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

スクリプト全体をルートとして実行している場合、コマンドのバックグラウンドの典型的な実行方法のほとんどが適用されます。これには、追加&や、必要に応じてnohup(既に知っている)の使用が含まれます。ただし、このためには、このオプションを使用openvpnすることを強く検討する必要があり--daemonます。


驚くほど包括的で思慮深い答え。よくやった。
-gwideman

2

TL; DRデーモンモードで実行します。openvpn --config Windscribe-Japan.ovpn --daemon

構成(.ovpn)ファイル名をopenvpnコマンドに渡すことは、他のオプションが指定されていない場合にのみ機能します。--daemonoption を指定すると、openvpnがオプションパラメーターとしてファイル名を解析しようとし、Optionsエラーをスローします。

回答:

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

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

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


0

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

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

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

/unix//a/366680/198666を参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.