Bagaimana saya bisa menjalankan OpenVPN sebagai root di latar belakang, dalam skrip?

22

Saya ingin menulis skrip yang memanggil openvpnterlebih dahulu, diikuti oleh ssh. Saat mengetik perintah

sudo openvpn ~/my_connection.ovpn

di command prompt saya mendapatkan output berikut:

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

Perintah ini memblokir dan shell tidak dilepaskan. Untuk memulai koneksi ssh setelahnya saya perlu mendorong proses openvpn ke latar belakang dengan mengetik Ctrl+ Zdiikuti oleh a bg.

Namun, saya ingin memanggil langkah koneksi openvpn dan ssh secara otomatis hanya dengan memanggil file bash saya. Bagaimana cara saya meniru Ctrl+ Zdan bglangkah - langkah dalam file ini?

Saya sudah mencoba menambahkan &ke openvpnperintah dan menempatkan nohupdi depannya. Tidak ada yang berhasil.

batal
sumber
Pertanyaan semacam ini telah ditanyakan berulang kali. Jika Anda membutuhkan bantuan, Anda benar-benar perlu memposting skrip Anda.
Panther
gunakan sudo -buntuk menjalankan perintah yang mengikutinya di latar belakang
Nick Sillito
1
Tampak bagi saya bahwa ini benar-benar bukan duplikat dari pertanyaan itu , yang hampir tidak mencakup menjalankan program latar belakang sebagai root, dan sama sekali tidak mencakup bagaimana cara benar daemonisasi OpenVPN.
Eliah Kagan
Maka kita harus mengubah judul lagi untuk menunjukkan bahwa saya mencoba menjalankan program latar belakang sebagai root.
null
@null Saya sudah mengedit ulang judul, seperti yang diminta. OpenVPN sering dijalankan sebagai root dan, dalam situasi di mana tidak, --daemonopsi masih dapat digunakan, tetapi Anda benar bahwa bagian tentang menjalankannya sebagai root adalah pusat pertanyaan ini dan harus tercermin dalam judulnya . Terima kasih telah menunjukkan ini!
Eliah Kagan

Jawaban:

35

TL; DR: Gunakan sudo -batau, lebih baik ,.openvpn [...] --daemon

Karena Anda menjalankan openvpn(dan, kurang spesifik, karena Anda ingin menjalankan program sebagai root di latar belakang), informasi yang paling umum dikeluarkan tentang cara menjalankan perintah di latar belakang tidak mengatasi situasi Anda. Kamu berkata:

Saya sudah mencoba menambahkan a & ke perintah cpenvpn dan menempatkan nohop di depannya. Keduanya tidak berfungsi.

Perintah Anda adalah:

sudo openvpn ~/my_connection.ovpn

Di bawah sudokonfigurasi default, jika Anda belum memasukkan kata sandi Anda sudodalam konteks yang sama (untuk penggunaan interaktif, biasanya ini berarti terminal yang sama) maka ia akan meminta kata sandi Anda. Tetapi jika Anda menjalankan perintah di latar belakang dengan menambahkan &maka Anda tidak akan ditampilkan baris atau diberi kesempatan untuk mengetiknya.[sudo] password for user:

Jadi dalam situasi ini, menjalankan perintah, memasukkan kata sandi, dan mengirimnya ke latar belakang setelahnya adalah cara yang masuk akal untuk melakukannya, untuk penggunaan interaktif .

Tapi itu bukan satu-satunya cara dan, seperti yang Anda katakan, Anda tidak akan mau melakukan itu dalam naskah .

Cara 1: Pastikan Anda sudomemiliki cap waktu yang baru.

Anda dapat memastikan bahwa sudomemiliki cap waktu saat ini ketika digunakan untuk menjalankan perintah Anda, dengan terlebih dahulu menjalankan:

sudo -v

Kemudian, setelah itu, Anda dapat menjalankan:

sudo openvpn ~/my_connection.ovpn &

Namun, biasanya lebih baik untuk menghindari &(dan nohup) sama sekali ketika Anda ingin menjalankan perintah di latar belakang sudo. Ini khususnya kasus untuk scripting.

Cara 2: Gunakan sudo -b. Secara umum, ini biasanya yang Anda inginkan.

Sebagai gantinya, Anda dapat menjalankan sudodirinya sendiri di latar depan, tetapi melewati -bbendera sehingga sudomenyebabkan perintah untuk dijalankan di latar belakang.

sudo -b openvpn ~/my_connection.ovpn

Ini biasanya merupakan cara yang lebih baik, terutama jika Anda meletakkan perintah dalam skrip. Dengan sudo -bAnda tidak mendapatkan kontrol pekerjaan , tetapi dalam shell script kontrol pekerjaan dinonaktifkan secara default dan Anda biasanya tidak menggunakannya .

Seperti yang man sudodijelaskan:

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

Ini berfungsi karena tidak ada yang berjalan di latar belakang sampai setelah sudo menerima kata sandi Anda (jika perlu) dan memutuskan bahwa Anda diizinkan untuk menjalankan perintah.

Cara 3: Tapi untuk openvpn, Anda mungkin harus menjalankannya --daemon.

openvpnakan berjalan di latar belakang secara otomatis jika Anda menjalankannya dengan --daemonopsi:

sudo openvpn ~/my_connection.ovpn --daemon

Lulus --daemonsetelah .opvnnama file Anda daripada sebelumnya; argumen berikut --daemon, jika ada, ditafsirkan sebagai nama yang openvpnharus digunakan oleh proses daemonized . (Apakah tidak juga append &.)

Apakah ini sesuai atau tidak tergantung pada apakah atau tidak ada interaksi harus terjadi setelah openvpntelah dijalankan tetapi sebelum terwujud. Dan itu tergantung, sebagian, pada apa yang diatur ~/my_connection.ovpn. Tetapi jika openvpntidak bisa segera daemonize, maka semua cara lain untuk segera menjalankannya di latar belakang juga akan rusak .

Oleh karena itu, dalam situasi di mana Anda tahu bahwa Anda ingin openvpnuntuk mulai berjalan di latar belakang, dan Anda tahu Anda tidak akan ingin membawa kembali ke latar depan, Anda harus sangat mempertimbangkan metode memohon itu dengan --daemonpilihan. Ini khusus untuk - openvpnsebagian besar program tidak mendukung --daemonopsi, meskipun banyak program server memiliki beberapa opsi seperti itu. (Namun nama dan sintaks bervariasi.)

Untuk memutuskan apakah atau tidak untuk menggunakan opsi ini (dan bagaimana Anda ingin menggunakannya), saya sarankan Anda membaca dengan openvpnhalaman buku panduan , terutama pada bagian --daemon. Ini memiliki banyak informasi yang berguna, dan saya hanya mengutip paragraf pertama di sini:

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

Cara 4 : Kadang-kadang masuk akal untuk menjalankan seluruh skrip sebagai root.

Jika Anda memiliki skrip yang melakukan beberapa tindakan sebagai root, skrip tidak memiliki aktivitas signifikan yang secara wajar dijalankan bukan sebagai root, dan tidak pernah ada yang berguna untuk menjalankan skrip sebagai pengguna non-root, maka pengguna skrip sebaiknya menjalankannya sebagai root.

Jika ini masalahnya, maka Anda harus menghapus sudodari perintah dalam skrip. Ketika skrip dijalankan sebagai root, tidak perlu sudo. (Meskipun root kaleng, secara default, jalankan perintah apapun sebagai pengguna termasuk dirinya dengan sudodan tidak perlu password untuk melakukannya. Jadi, jika Anda melakukan hal cuti dari sudodalam script maka akan mungkin masih bekerja.)

Jika Anda memiliki contoh sudodalam naskah yang benar-benar digunakan untuk menjalankan perintah karena beberapa user selain root (dengan ), maka Anda harus tetap menjaga mereka contoh.-u user

Jika seluruh skrip dijalankan sebagai root, maka sebagian besar cara khas membuat perintah dijalankan di latar belakang berlaku, termasuk menambahkan &dan, jika perlu, penggunaan nohup(yang sudah Anda ketahui). Untuk ini, meskipun, Anda masih harus sangat mempertimbangkan menggunakan openvpndengan --daemonpilihan.

Eliah Kagan
sumber
Jawaban yang sangat komprehensif dan bijaksana. Sudah selesai dilakukan dengan baik.
gwideman
2

TL; DR Jalankan dalam mode daemon:openvpn --config Windscribe-Japan.ovpn --daemon

Melewati nama file konfigurasi (.ovpn) ke openvpnperintah hanya berfungsi jika tidak ada opsi lain yang ditentukan. Jika saya menentukan --daemonopsi maka openvpn mencoba mengurai nama file sebagai parameter opsi dan melempar kesalahan Opsi: Saya mencoba mengurai "Windscribe.ovpn" sebagai parameter --option tetapi saya tidak melihat '-' yang memimpin .

Menjawab:

Untuk menghindari ini, nama file harus ditentukan dengan --configopsi. Sebagai contoh openvpn --config Windscribe.ovpn --daemon,. Kemudian ikuti syslog dengan tail -f /var/log/syslog, untuk pemeriksaan lebih lanjut.

Anda juga dapat memeriksa sebelum dan sesudah keluaran dari perintah curl ini curl ifconfig.countuk memastikan bahwa VPN terhubung.

Catatan: Ini akan menjaga daemon tetap berjalan bahkan setelah Anda keluar dari sesi SSH.

RajaRaviVarma
sumber
0

Anda bisa menyalin

File .conf ke / etc / openvpn /

Kemudian tanyakan 'service openvpn @ confName start' untuk menangani semua daemonisasi dan sudo untuk Anda.

Lihat /unix//a/366680/198666

pengguna18099
sumber