ฉันจะเรียกใช้ OpenVPN เป็น root ในพื้นหลังในสคริปต์ได้อย่างไร


22

ผมอยากจะเขียนสคริปต์ที่เรียกแรกตามด้วยopenvpn sshเมื่อพิมพ์คำสั่ง

sudo openvpn ~/my_connection.ovpn

ใน command prompt ฉันได้รับผลลัพธ์ต่อไปนี้:

...
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+ ตามด้วยZbg

อย่างไรก็ตามฉันต้องการเรียกขั้นตอนการเชื่อมต่อ openvpn และ ssh โดยอัตโนมัติเพียงแค่เรียกไฟล์ bash ของฉัน ฉันจะจัดการเลียนแบบCtrl+ Zและbgขั้นตอนในไฟล์นี้ได้อย่างไร

ฉันได้พยายามผนวก&กับopenvpnคำสั่งและไปยังสถานที่nohupในด้านหน้าของมัน ไม่ทำงาน


คำถามประเภทนี้ถูกถามหลายครั้ง หากคุณต้องการความช่วยเหลือคุณต้องโพสต์สคริปต์ของคุณจริงๆ
Panther

ใช้sudo -bเพื่อเรียกใช้คำสั่งที่ตามมาในพื้นหลัง
Nick Sillito

1
สำหรับฉันแล้วดูเหมือนว่านี่ไม่ใช่คำถามที่ซ้ำกันซึ่งครอบคลุมการทำงานของโปรแกรมพื้นหลังเป็นหลักและแทบจะไม่ครอบคลุมถึงวิธีที่จะทำให้เกิดความผิดเพี้ยน OpenVPN อย่างถูกต้อง
Eliah Kagan

จากนั้นเราควรเปลี่ยนชื่ออีกครั้งเพื่อชี้ให้เห็นว่าฉันพยายามเรียกใช้โปรแกรมพื้นหลังเป็นรูต
null

@null ฉันได้แก้ไขชื่อเรื่องอีกครั้งตามที่ร้องขอ OpenVPN มักถูกเรียกใช้ในฐานะรูทและในสถานการณ์ที่ไม่ได้ใช้--daemonตัวเลือกอาจยังคงใช้อยู่ แต่คุณคิดถูกว่าส่วนที่เกี่ยวกับการใช้งานรูทนั้นเป็นส่วนสำคัญของคำถามนี้และควรสะท้อนให้เห็นในชื่อของมัน . ขอบคุณที่ชี้นำสิ่งนี้!
Eliah Kagan

คำตอบ:


35

TL; DR:การใช้งานหรือดีกว่าsudo -bopenvpn [...] --daemon

เนื่องจากคุณกำลังใช้งานopenvpn(และโดยเฉพาะอย่างยิ่งเนื่องจากคุณต้องการรันโปรแกรมในฐานะรูทในพื้นหลัง) ข้อมูลที่จ่ายทั่วไปเกี่ยวกับวิธีการเรียกใช้คำสั่งในพื้นหลังไม่ได้ระบุถึงสถานการณ์ของคุณ คุณพูดว่า:

ฉันพยายามต่อท้าย & ไปยังคำสั่ง 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กระบวนการdaemonized ควรใช้ (ทำไม่ได้นอกจากนี้ยังผนวก&.)

ไม่ว่าจะเหมาะสมหรือไม่นั้นขึ้นอยู่กับว่าการโต้ตอบใด ๆ จะต้องเกิดขึ้นหลังจากที่openvpnถูกเรียกใช้หรือไม่ และที่~/my_connection.ovpnขึ้นอยู่ในส่วนที่เกี่ยวกับสิ่งที่ตั้งขึ้นใน แต่ถ้าopenvpnไม่สามารถ daemonize ได้ทันทีวิธีอื่นทั้งหมดของการเรียกใช้ทันทีในพื้นหลังก็จะแตกเช่นกัน

ดังนั้นในสถานการณ์ใด ๆ ที่คุณรู้ว่าคุณต้องการ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 : บางครั้งก็สมเหตุสมผลที่จะเรียกใช้สคริปต์ทั้งหมดในฐานะรูท

หากคุณมีสคริปต์ที่ดำเนินการหลายอย่างในฐานะรูทสคริปต์จะไม่มีกิจกรรมที่สำคัญใด ๆ ที่จะถูกเรียกใช้โดยไม่เป็นรูทและไม่มีประโยชน์ใด ๆ ที่จะมาจากการรันสคริปต์ในฐานะผู้ใช้ที่ไม่ใช่รูท ผู้ใช้สคริปต์อาจจะรันเป็นรูท

หากเป็นกรณีนี้คุณควรลบออกsudoจากคำสั่งในสคริปต์ sudoสคริปต์เป็นรากไม่มีความจำเป็นในการ (แม้ว่ารากใช้สามารถตามค่าเริ่มต้นเรียกใช้คำสั่งใด ๆ ที่เป็นผู้ใช้ใด ๆ รวมทั้งตัวเองด้วยsudoและไม่ต้องใช้รหัสผ่านจะทำเช่นนั้น. ดังนั้นถ้าคุณทำกรณีลาsudoในสคริปต์แล้วมันอาจจะยังคงทำงาน.)

หากคุณมีอินสแตนซ์ใด ๆsudoในสคริปต์ที่ใช้เพื่อเรียกใช้คำสั่งในฐานะผู้ใช้รายอื่นที่ไม่ใช่รูท (ด้วย) คุณควรเก็บอินสแตนซ์เหล่านั้นไว้-u user

หากสคริปต์ทั้งหมดกำลังถูกเรียกใช้ในฐานะรูทดังนั้นวิธีการทั่วไปในการสร้างคำสั่งในพื้นหลังนั้นรวมถึงการต่อท้าย&และหากจำเป็นต้องใช้การใช้nohup(ซึ่งคุณทราบแล้ว) อย่างไรก็ตามสำหรับสิ่งนี้คุณควรพิจารณาใช้openvpnกับ--daemonตัวเลือก


คำตอบที่ครอบคลุมและน่าพิจารณาอย่างยิ่ง ทำได้ดี.
gwideman

2

TL; DRรันในโหมด daemon:openvpn --config Windscribe-Japan.ovpn --daemon

การส่งผ่านชื่อไฟล์การกำหนดค่า (.ovpn) ไปยังopenvpnคำสั่งใช้งานได้ก็ต่อเมื่อไม่มีการระบุตัวเลือกอื่น ถ้าฉันระบุ--daemonตัวเลือกแล้ว OpenVPN พยายามที่จะแยกชื่อไฟล์เป็นพารามิเตอร์ตัวเลือกและพ่นข้อผิดพลาดตัวเลือก: ฉันพยายามที่จะแยก "Windscribe.ovpn" เป็นพารามิเตอร์ --option แต่ผมไม่เห็นชั้นนำ '-'

ตอบ:

เพื่อหลีกเลี่ยงปัญหานี้ต้องระบุชื่อไฟล์พร้อม--configตัวเลือก ตัวอย่างเช่นopenvpn --config Windscribe.ovpn --daemon. จากนั้นนำ syslog ไปด้วยtail -f /var/log/syslogเพื่อตรวจสอบเพิ่มเติม

คุณยังสามารถตรวจสอบก่อนและหลังเอาต์พุตของคำสั่ง curl นี้curl ifconfig.coเพื่อให้แน่ใจว่าเชื่อมต่อ VPN แล้ว

หมายเหตุ: สิ่งนี้จะทำให้ daemon ทำงานต่อไปแม้หลังจากที่คุณออกจากเซสชัน SSH


0

คุณสามารถคัดลอกของคุณ

.conf ไฟล์เป็น / etc / openvpn /

จากนั้นขอให้ 'service openvpn @ confName start' จัดการกับ daemonizing และ sudo ทั้งหมดสำหรับคุณ

ดู/unix//a/366680/198666

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.