Làm cách nào tôi có thể chạy OpenVPN với quyền root trong nền, trong tập lệnh?


22

Tôi muốn viết một kịch bản gọi openvpntrước, theo sau ssh. Khi gõ lệnh

sudo openvpn ~/my_connection.ovpn

trong dấu nhắc lệnh tôi nhận được đầu ra sau:

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

Lệnh này đang chặn và shell không được phát hành. Để bắt đầu kết nối ssh sau đó, tôi cần đẩy quá trình openvpn vào nền bằng cách gõ Ctrl+ Ztheo sau là a bg.

Tuy nhiên, tôi muốn gọi bước kết nối openvpn và ssh tự động bằng cách chỉ gọi tệp bash của tôi. Làm cách nào để quản lý mô phỏng Ctrl+ Zbgcác bước trong tệp này?

Tôi đã cố gắng để nối thêm một &đến openvpnlệnh và đặt nohupở phía trước nó. Không hoạt động.


Loại câu hỏi này đã được hỏi nhiều lần. Nếu bạn cần giúp đỡ, bạn thực sự cần phải đăng kịch bản của bạn.
Panther

sử dụng sudo -bđể chạy lệnh theo sau nó
Nick Sillito

1
Dường như với tôi rằng đây thực sự không phải là một bản sao của câu hỏi đó, hầu như không bao gồm việc chạy các chương trình nền dưới dạng root và hoàn toàn không bao gồm cách trình bày đúng cách OpenVPN.
Eliah Kagan

Sau đó, chúng ta nên thay đổi tiêu đề một lần nữa để chỉ ra rằng tôi đã cố chạy một chương trình nền là root.
null

@null Tôi đã chỉnh sửa lại tiêu đề, theo yêu cầu. OpenVPN thường được chạy dưới quyền root và trong các tình huống không có, --daemontùy chọn vẫn có thể được sử dụng, nhưng bạn có quyền rằng phần chạy nó là root trung tâm của câu hỏi này và nên được phản ánh trong tiêu đề của nó . Cảm ơn đã chỉ ra điều này!
Eliah Kagan

Câu trả lời:


35

TL; DR: Sử dụng sudo -bhoặc, tốt hơn , .openvpn [...] --daemon

Vì bạn đang chạy openvpn(và, ít cụ thể hơn, vì bạn muốn chạy một chương trình với quyền root trong nền), thông tin phổ biến nhất về cách chạy các lệnh trong nền không giải quyết được tình huống của bạn. Bạn đã nói:

Tôi đã cố gắng thêm một & vào lệnh cpenvpn và đặt nohop trước nó. Cả hai đều không hoạt động.

Lệnh của bạn là:

sudo openvpn ~/my_connection.ovpn

Trong sudocấu hình mặc định, nếu gần đây bạn chưa nhập mật khẩu cho sudocùng một ngữ cảnh (để sử dụng tương tác, thông thường, điều này có nghĩa là cùng một thiết bị đầu cuối) thì nó sẽ hỏi mật khẩu của bạn. Nhưng nếu bạn chạy lệnh trong nền bằng cách nối thêm &thì bạn sẽ không được hiển thị dòng hoặc có cơ hội nhập lệnh.[sudo] password for user:

Vì vậy, trong tình huống này, chạy lệnh, nhập mật khẩu của bạn và gửi nó đến nền sau đó là một cách hợp lý để làm điều đó, để sử dụng tương tác .

Nhưng đó không phải là cách duy nhất và, như bạn nói, bạn sẽ không muốn làm điều đó trong một kịch bản .

Cách 1: Đảm bảo sudocó dấu thời gian mới.

Bạn có thể đảm bảo rằng sudocó dấu thời gian hiện tại khi nó được sử dụng để chạy lệnh của bạn, bằng cách chạy đầu tiên:

sudo -v

Sau đó, sau đó, bạn có thể chạy:

sudo openvpn ~/my_connection.ovpn &

Tuy nhiên, tốt hơn hết là tránh &(và nohup) hoàn toàn khi bạn muốn chạy một lệnh trong nền với sudo. Điều này đặc biệt là trường hợp cho kịch bản.

Cách 2: Sử dụng sudo -b. Nói chung, đây thường là những gì bạn muốn.

Thay vào đó, bạn có thể sudotự chạy ở nền trước, nhưng truyền -bcờ để sudokhiến lệnh được chạy trong nền.

sudo -b openvpn ~/my_connection.ovpn

Đây thường là một cách tốt hơn, đặc biệt nếu bạn đang đặt lệnh trong một tập lệnh. Với sudo -bbạn không có quyền kiểm soát công việc , nhưng trong kịch bản shell, điều khiển công việc bị tắt theo mặc định và bạn thường không nên sử dụng nó .

Như man sudogiải thích:

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

Điều này hoạt động vì không có gì đang chạy trong nền cho đến khi sudo nhận được mật khẩu của bạn (nếu cần) và xác định rằng bạn được phép chạy lệnh.

Cách 3: Nhưng đối với openvpn, có lẽ bạn chỉ nên chạy nó với --daemon.

openvpnsẽ tự động chạy trong nền nếu bạn chạy nó với --daemontùy chọn:

sudo openvpn ~/my_connection.ovpn --daemon

Vượt qua tên tệp --daemoncủa bạn .opvnchứ không phải trước đó; đối số sau đây --daemon, nếu có, được hiểu là tên mà openvpnquy trình trình bày nên sử dụng. (Do không còn append &).

Điều này có phù hợp hay không phụ thuộc vào việc có hay không bất kỳ tương tác nào phải xảy ra sau khi openvpnđược chạy nhưng trước khi nó khởi động. Và điều đó phụ thuộc, một phần, vào những gì được thiết lập ~/my_connection.ovpn. Nhưng nếu openvpnkhông thể ngay lập tức tạo ra, thì tất cả các cách khác để chạy ngay lập tức trong nền cũng sẽ bị hỏng .

Vì vậy, trong bất kỳ tình huống mà bạn biết bạn muốn openvpnđể bắt đầu chạy ở chế độ nền, và bạn biết bạn sẽ không muốn mang nó trở lại vào tiền cảnh, bạn nên xem xét mạnh mẽ phương pháp gọi nó với các --daemontùy chọn. Điều này đặc trưng cho openvpn- các chương trình tối đa không hỗ trợ --daemontùy chọn, mặc dù nhiều chương trình máy chủ có một số tùy chọn như vậy. (Tuy nhiên, tên và cú pháp khác nhau.)

Để quyết định có hay không sử dụng tùy chọn này (và cách bạn muốn sử dụng nó), tôi khuyên bạn nên đọc các openvpntrang hướng dẫn , đặc biệt là ở phần trên --daemon. Nó có rất nhiều thông tin hữu ích, và tôi chỉ trích dẫn đoạn đầu tiên ở đây:

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

Cách 4 : Đôi khi việc chạy toàn bộ tập lệnh là root.

Nếu bạn có một tập lệnh thực hiện nhiều hành động với tư cách là root, thì nó không có hoạt động quan trọng nào có thể được chạy một cách hợp lý không phải là root và không bao giờ có gì hữu ích khi chạy tập lệnh với tư cách là người dùng không phải root, sau đó người dùng của tập lệnh có lẽ chỉ nên chạy nó dưới quyền root.

Nếu đây là trường hợp, thì bạn nên loại bỏ sudokhỏi các lệnh trong kịch bản. Khi tập lệnh chạy bằng root, không cần sudo. (Mặc dù người dùng root có thể, theo mặc định, chạy bất kỳ lệnh nào vì bất kỳ người dùng nào cũng bao gồm chính nó sudovà không cần mật khẩu để làm như vậy. Vì vậy, nếu bạn để lại các sudophiên bản trong tập lệnh thì có thể nó vẫn hoạt động.)

Nếu bạn có bất kỳ phiên bản nào sudotrong tập lệnh thực sự được sử dụng để chạy các lệnh như một số người dùng khác ngoài root (với ), thì bạn vẫn nên giữ các phiên bản đó.-u user

Nếu toàn bộ tập lệnh đang được chạy dưới quyền root, thì hầu hết các cách tạo lệnh chạy trong nền đều được áp dụng, bao gồm nối thêm &và, khi cần, sử dụng nohup(mà bạn đã biết). Đối với điều này, mặc dù, bạn vẫn nên cân nhắc mạnh mẽ sử dụng openvpnvới --daemontùy chọn.


Một câu trả lời toàn diện và chu đáo. Làm tốt.
gwideman

2

TL; DR Chạy nó trong chế độ daemon:openvpn --config Windscribe-Japan.ovpn --daemon

Truyền tên tệp cấu hình (.ovpn) cho openvpnlệnh chỉ hoạt động nếu không có tùy chọn nào khác được chỉ định. Nếu tôi chỉ định --daemontùy chọn thì openvpn cố phân tích tên tệp dưới dạng tham số tùy chọn và ném lỗi Tùy chọn: Tôi đang cố phân tích "Windscribe.ovpn" dưới dạng tham số --option nhưng tôi không thấy dấu '-' hàng đầu .

Câu trả lời:

Để tránh điều này, tên tệp phải được chỉ định với --configtùy chọn. Ví dụ , openvpn --config Windscribe.ovpn --daemon. Sau đó, đuôi syslog với tail -f /var/log/syslog, để kiểm tra thêm.

Bạn cũng có thể kiểm tra đầu ra trước và sau của lệnh curl này curl ifconfig.cođể đảm bảo rằng VPN được kết nối.

Lưu ý: Điều này sẽ giữ cho daemon chạy ngay cả sau khi bạn đăng xuất khỏi phiên SSH.


0

Bạn chỉ có thể sao chép

tập tin .cs vào / etc / openvpn /

Sau đó yêu cầu 'dịch vụ openvpn @ confName start' để xử lý tất cả các trình nền và sudo cho bạn.

Xem /unix//a/366680/198666

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.