OpenVPN ಶೆಲ್ನಲ್ಲಿ ಕೆಲಸ ಮಾಡುತ್ತದೆ ಆದರೆ cron ಅಡಿಯಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ: ಕಾರಣ PATH
ಶೆಲ್ನಿಂದ ಸಂಪರ್ಕಿಸುವ ಆದೇಶವು ಟನೆಲ್ ಪ್ರಾರಂಭವಾಗುವ ಮೊದಲೇ cron ಅಥವಾ subprocess ಅಡಿಯಲ್ಲಿ ವಿಫಲವಾಗಬಹುದು. ಪಥ, ಕೆಲಸದ ಡೈರೆಕ್ಟರಿ ಮತ್ತು ಟರ್ಮಿನಲ್ ಸರಿಪಡಿಸಿ.
ಅದೇ ಆದೇಶವು ಶೆಲ್ನಿಂದ ಸಂಪರ್ಕಿಸುತ್ತದೆ ಮತ್ತು cron ಅಡಿಯಲ್ಲಿ ಸಾಯುತ್ತದೆ, ಆದ್ದರಿಂದ ಟನೆಲ್ ಅಥವಾ ಪ್ರಮಾಣಪತ್ರವೇ ದೋಷಿ ಎಂಬುದು ಸಹಜ ತೀರ್ಮಾನ. ಅದನ್ನು ನಂಬುವ ಮೊದಲು ಎರಡು ರನ್ಗಳಲ್ಲಿ ಏನು ಸಾಮಾನ್ಯವಿದೆ ಎಂದು ನೋಡಿ: ಬೈನರಿ, ಸಂರಚನೆ ಮತ್ತು ರುಜುವಾತುಗಳು ಒಂದೇ ರೀತಿ ಇವೆ, ಮತ್ತು ಪ್ರಕ್ರಿಯೆಯ ಪರಿಸರ ಮಾತ್ರ ಬದಲಾಗಿದೆ. ಪ್ರೋಗ್ರಾಂ ಕಂಡುಬಂದೇ ಇಲ್ಲದಿದ್ದಾಗ, TLS ಡೀಬಗ್ ಮಾಡುವ ಯಾವುದೇ ಪ್ರಮಾಣ ಸಹಾಯ ಮಾಡುವುದಿಲ್ಲ. ಸರಿಪಡಿಸುವಿಕೆ ಸಾಮಾನ್ಯವಾಗಿ ಪಥ, ಕೆಲಸದ ಡೈರೆಕ್ಟರಿ ಮತ್ತು ಕೆಲವು ಪರಿಸರ ಚರಗಳಲ್ಲಿ ಇರುತ್ತದೆ, VPN ನಲ್ಲಿ ಅಲ್ಲ.
ಕೆಲಸ ಮಾಡುವ ಶೆಲ್ನಲ್ಲಿ command -v openvpn ಉತ್ತರವನ್ನು ಮುದ್ರಿಸುತ್ತದೆ, ಮತ್ತು ಅದು ಬಹಳ ಬಾರಿ /usr/sbin/openvpn, ಅಂದರೆ cron ತನ್ನ ಹುಡುಕಾಟ ಪಥದಲ್ಲಿ ಇಡದ ಡೈರೆಕ್ಟರಿ.
ಟನೆಲ್ ಎಂದೂ ಪ್ರಾರಂಭವಾಗಲಿಲ್ಲ, ಆದ್ದರಿಂದ ಟನೆಲ್ ಸಮಸ್ಯೆ ಅಲ್ಲ
cron ಪ್ರಾರಂಭಿಸುವ ಕೆಲಸಗಳು ಕನಿಷ್ಠ ಪರಿಸರವನ್ನು ಆನುವಂಶಿಕವಾಗಿ ಪಡೆಯುತ್ತವೆ, ಸಾಂಪ್ರದಾಯಿಕವಾಗಿ PATH=/usr/bin:/bin, ಮತ್ತು ಯಾವುದೇ ನಿಯಂತ್ರಣ ಟರ್ಮಿನಲ್ ಪಡೆಯುವುದಿಲ್ಲ. /usr/sbin ಅಥವಾ /usr/local/sbin ನಲ್ಲಿ ಸ್ಥಾಪಿಸಿದ ಯಾವುದೇ ವಸ್ತು ಆ ಪಟ್ಟಿಯಿಂದ ಸರಳವಾಗಿ ಗೈರುಹಾಜರಾಗಿರುತ್ತದೆ, ಮತ್ತು ಲಾಗ್ ಸಾಲು TLS ದೋಷದ ಬದಲು openvpn: not found ಎಂದು ಓದುತ್ತದೆ. Python ನ subprocess ಬೇರೆ ರೀತಿಯಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ: ಅದು ಇಂಟರ್ಪ್ರಿಟರ್ ಪ್ರಕ್ರಿಯೆಯ ಪರಿಸರವನ್ನು ಆನುವಂಶಿಕವಾಗಿ ಪಡೆಯುತ್ತದೆ, ಅದು cron ಗಿಂತ ಶ್ರೀಮಂತವಾಗಿರಬಹುದು ಆದರೆ ಟಿಲ್ಡಾ ವಿಸ್ತರಿಸಲು ಇನ್ನೂ ಶೆಲ್ ಇಲ್ಲ. ಎರಡೂ ವೈಫಲ್ಯಗಳು ಒಂದು ಪ್ಯಾಕೆಟ್ ಕೂಡ ಹೋಸ್ಟ್ ಬಿಡುವ ಮೊದಲೇ ಸಂಭವಿಸುತ್ತವೆ.
ಅವುಗಳನ್ನು ಬೇರ್ಪಡಿಸುವ ತ್ವರಿತ ಮಾರ್ಗವೆಂದರೆ ಕೊನೆಯದಕ್ಕಿಂತ ಮೊದಲ ದೋಷವನ್ನು ಓದುವುದು. ಕಾಣೆಯಾದ ಬೈನರಿ ಶೆಲ್ ಅಥವಾ Python ಎಕ್ಸೆಪ್ಶನ್ ಉಂಟುಮಾಡುತ್ತದೆ, ಕೆಟ್ಟ ಸಂರಚನೆ OpenVPN ಬಳಕೆ ಸಂದೇಶವನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ, ಮತ್ತು ನಿಜವಾದ ಹ್ಯಾಂಡ್ಶೇಕ್ ವೈಫಲ್ಯ ಸಮಯ ಮುದ್ರೆಗಳು ಮತ್ತು ಸಹವರ್ತಿ ವಿಳಾಸಗಳನ್ನು ಉಂಟುಮಾಡುತ್ತದೆ. ಮೂರನೆಯದು ಮಾತ್ರ ಟನೆಲ್ ಸಮಸ್ಯೆ.
ಸಂಪೂರ್ಣ ಪಥಗಳು ಮತ್ತು ಆರ್ಗ್ಯುಮೆಂಟ್ ಪಟ್ಟಿಗಳು ಶೆಲ್ ಸ್ಟ್ರಿಂಗ್ಗಳನ್ನು ಮೀರುತ್ತವೆ
ಪರಿಹರಿಸಿದ ಪಥವನ್ನು ಸ್ಪಷ್ಟವಾಗಿ ನೀಡಿ ಮತ್ತು ಶೆಲ್ ಅನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಬಿಟ್ಟುಬಿಡಿ. subprocess.run(["/usr/sbin/openvpn", "--config", config, "--verb", "4"], capture_output=True, text=True, timeout=90) ನಿಮಗೆ ರಿಟರ್ನ್ ಕೋಡ್, stdout ಮತ್ತು stderr ನೀಡುತ್ತದೆ, ಫೈಲ್ ಹೆಸರನ್ನು ಅರ್ಥೈಸಲು ಶೆಲ್ ಅನ್ನು ಕೇಳದೆಯೇ. ಸಂರಚನೆಯ ಪಥವನ್ನು os.environ["HOME"] ಅಥವಾ pathlib.Path.home() ನಿಂದ ನಿರ್ಮಿಸಿ, ಟಿಲ್ಡಾವನ್ನು ಎಂದಿಗೂ ವಿಸ್ತರಿಸಬೇಕಾಗಿಲ್ಲ. ನಿಜವಾಗಿ ಶೆಲ್ ಸಿಂಟ್ಯಾಕ್ಸ್ ಬೇಕಾದಾಗ, shlex.split ಬಳಸಿ, ಏಕೆಂದರೆ .split() ನಿಂದ ಸ್ಟ್ರಿಂಗ್ ವಿಭಜಿಸುವುದು ಜಾಗವಿರುವ ಯಾವುದೇ ಪಥದಲ್ಲಿ ಮುರಿಯುತ್ತದೆ. stderr ಸಹ ಓದಿ, ಏಕೆಂದರೆ OpenVPN ತನ್ನ ಹೆಚ್ಚಿನ ಆರಂಭಿಕ ವೈಫಲ್ಯಗಳನ್ನು ಅಲ್ಲಿಯೇ ಬರೆಯುತ್ತದೆ.
ಅದೇ ನಿಯಮ cron ಗೂ ಅನ್ವಯಿಸುತ್ತದೆ: ಕೆಲಸದ ಸಾಲು ಲಾಗಿನ್ ಶೆಲ್ ಅಲ್ಲ, ಆದ್ದರಿಂದ ಯಾವುದೂ ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ ಲೋಡ್ ಮಾಡುವುದಿಲ್ಲ ಮತ್ತು ಯಾವುದೂ ನಿಮ್ಮ ಅಲಿಯಾಸ್ಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುವುದಿಲ್ಲ.
crontab ವಾಸ್ತವವಾಗಿ ಏನನ್ನು ಆನುವಂಶಿಕವಾಗಿ ಪಡೆಯುತ್ತದೆ
crontab ನಮೂದು crontab ಘೋಷಿಸುವ ಪರಿಸರವನ್ನು ಜೊತೆಗೆ ಕೆಲವು ಆನುವಂಶಿಕ ಡೀಫಾಲ್ಟ್ಗಳನ್ನು ಪಡೆಯುತ್ತದೆ, ಆದ್ದರಿಂದ ಪಥವನ್ನು ಪೂರ್ಣವಾಗಿ ಬರೆಯಿರಿ ಅಥವಾ ಕರೆಯನ್ನು ಅದನ್ನು ಮಾಡುವ ಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ ಸುತ್ತಿ. ಫೈಲ್ನ ಮೇಲ್ಭಾಗದಲ್ಲಿ PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ನಂತಹ ಸಾಲು ಸಾಮಾನ್ಯ ಸ್ಥಾಪನಾ ಸ್ಥಳಗಳನ್ನು ಆವರಿಸುತ್ತದೆ, ಮತ್ತು >> cron.log 2>&1 ನೊಂದಿಗೆ ಮರುನಿರ್ದೇಶಿಸುವುದು ಮುಂದಿನ ವೈಫಲ್ಯವನ್ನು ಓದಲು ಸಾಧ್ಯವಾಗಿಸುತ್ತದೆ. ಪಾಸ್ಫ್ರೇಜ್ನಿಂದ ರಕ್ಷಿಸಿದ ಪ್ರೊಫೈಲ್ಗೆ cron ಅಡಿಯಲ್ಲಿ ತನ್ನ ರಹಸ್ಯವನ್ನು ಕೇಳುವ ದಾರಿ ಇಲ್ಲ, ಏಕೆಂದರೆ ಕೇಳಲು ಟರ್ಮಿನಲ್ ಇಲ್ಲ. ಅಂತಹ ಸಂಪರ್ಕವು ರುಜುವಾತು ಫೈಲ್ ಓದಬಲ್ಲ systemd ಘಟಕಕ್ಕೆ ಸೇರಿದೆ, ತನ್ನನ್ನು ಸಂವಾದಾತ್ಮಕ ಎಂದು ನಟಿಸುವ ಕೆಲಸಕ್ಕೆ ಅಲ್ಲ.
ಸಾಪೇಕ್ಷ ಪಥಗಳು ಎರಡನೇ ಬಲೆ. ಪರೀಕ್ಷಾ ರನ್ ಸಾಮಾನ್ಯವಾಗಿ ಪ್ರೊಫೈಲ್ ಇರುವ ಫೋಲ್ಡರ್ನಿಂದ ನಡೆಯುತ್ತದೆ, ಮತ್ತು cron ಕೆಲಸ ಸಂಪೂರ್ಣ ಬೇರೆಡೆಯಿಂದ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ, ಆದ್ದರಿಂದ --config office.ovpn ಅಲ್ಲಿ ಇಲ್ಲದ ಫೈಲ್ಗೆ ಪರಿಹರಿಸುತ್ತದೆ ಮತ್ತು ಸಂದೇಶವು ಕಾಣೆಯಾದ ಟನೆಲ್ ಬದಲು ಕಾಣೆಯಾದ ಫೈಲ್ ಎಂದು ಓದುತ್ತದೆ.
ಪರಿಸರವನ್ನು ತೆಗೆದು ಸಾಬೀತು ಮಾಡಿ
ಕನಿಷ್ಠ ಪರಿಸರವನ್ನು ನೇರವಾಗಿ ಮರುಸೃಷ್ಟಿಸಿ: env -i PATH=/usr/bin:/bin /usr/sbin/openvpn --config office.ovpn --verb 4. ಆ ರನ್ನಿಂದ ಪಥ ಅಥವಾ ಟರ್ಮಿನಲ್ ದೂರು ಬಂದರೆ ಸಮಸ್ಯೆ VPN ಮೇಲಿದೆ ಎಂದರ್ಥ. ಅದು ಸಂಪರ್ಕಿಸಿದರೆ, ಉಳಿದ ಶಂಕಿತರು ಅದು ಓಡುವ ಖಾತೆ, ಅದು ಪ್ರಾರಂಭಿಸುವ ಡೈರೆಕ್ಟರಿ ಮತ್ತು ಅದು ಪ್ರಸ್ತುತಪಡಿಸುವ ರುಜುವಾತು. ಎರಡೂ ಫಲಿತಾಂಶಗಳಲ್ಲಿ ಯಾವುದಾದರೂ ಪ್ರಮಾಣಪತ್ರ ಪರಿಶೀಲನೆಯ ಇನ್ನೊಂದು ಸುತ್ತಿಗಿಂತ ಉತ್ತಮ.
ನಂತರ ಸುತ್ತುವರಿಕೆಯನ್ನು ಸ್ವಯಂ ವರದಿ ಮಾಡುವಂತೆ ಮಾಡಿ. ಅದು ತಲುಪಿದ ಪ್ರತಿ ಹಂತಕ್ಕೂ ಪ್ರತ್ಯೇಕ ಸ್ಥಿತಿಯೊಂದಿಗೆ ನಿರ್ಗಮಿಸಿ, ಎರಡೂ ಸ್ಟ್ರೀಮ್ಗಳನ್ನು ಸಮಯ ಮುದ್ರೆಯೊಂದಿಗೆ ಲಾಗ್ ಮಾಡಿ, ಮತ್ತು ಮುಂದಿನ ವೈಫಲ್ಯವು ಅದು ಪಥ ಪರಿಹಾರದಲ್ಲಿ, ದೃಢೀಕರಣದಲ್ಲಿ, ಅಥವಾ ಟನೆಲ್ ಈಗಾಗಲೇ ಮೇಲೆ ಇದ್ದ ನಂತರ ಸತ್ತಿದೆಯೇ ಎಂದು ಹೇಳುತ್ತದೆ.
ಘಟಕಕ್ಕೆ ಸರಿಯಾದ ಕ್ರಮವೂ ಬೇಕು: Wants=network-online.target ಜೊತೆಗೆ After=network-online.target ಕ್ಲೈಂಟ್ ವಿಳಾಸ ಅಥವಾ ಡೀಫಾಲ್ಟ್ ಮಾರ್ಗ ಇರುವ ಮೊದಲೇ ಪ್ರಾರಂಭವಾಗುವುದನ್ನು ತಡೆಯುತ್ತವೆ, ಇಲ್ಲದಿದ್ದರೆ ಅದು ಪ್ರಮಾಣಪತ್ರ ಅಥವಾ TLS ದೋಷಗಳಾಗಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ ಮತ್ತು ಕೈಯಿಂದ ಮರುಪ್ರಾರಂಭಿಸಿದಾಗ ಮಾಯವಾಗುತ್ತದೆ.