tạo kết nối SSH tự động khi khởi động


9

Tôi có một PC phía sau NAT tạo kết nối SSH ngược với VPC Digitalocean của tôi. Tôi sử dụng kết nối SSH đảo ngược này từ nhà để đăng nhập vào PC văn phòng của tôi (tôi được ủy quyền để làm như vậy) và sao chép các tệp và làm những việc quan trọng khác.

Mặc dù không thường xuyên, tôi nhận thấy rằng PC văn phòng của tôi khởi động lại (do mất điện, v.v.) và phá vỡ kết nối SSH bị đảo ngược mà nó đã thực hiện với VPC của tôi. Trong những trường hợp như vậy, tôi không thể kết nối từ PC ở nhà với PC văn phòng.

Tôi chạy đoạn mã sau để tạo kết nối đảo ngược + proxy động để ẩn danh lưu lượng truy cập của tôi (Vì tôi không bắt buộc phải chia sẻ thông tin duyệt web) được tạo tại PC văn phòng.

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

Không có cách nào tôi có thể chạy lại tập lệnh thsi trên PC văn phòng của mình khi khởi động lại vì tôi không ở đó. Để giải quyết vấn đề này, tôi đã cài đặt crontab sau.

Lưu ý: rev.shtập tin chứa dòng trên. Chứng chỉ "digitalOcean" và rev.sh được đặt trong Ubuntu home. Do đó, khi tôi thực thi ./rev.shtrong thiết bị đầu cuối Ubuntu của mình, tôi có được một proxy động và cũng có thể truy cập vào máy chủ yO DigitalOcean. Phương pháp này hoạt động 100%.

Tuy nhiên, khi tôi cài đặt chrontab theo phương pháp sau, My ub Ubuntu PC không bao giờ tạo proxy động. Tôi có thể thấy điều này bởi vì khi tôi kiểm tra proxy này từ Google Chrome, nó báo proxy đang từ chối kết nối.

Dưới đây là các cronejobs tôi đã thử như rễ cronejobs. Tôi cũng đã thử những thứ này như một người dùng bình thường, nhưng chúng vẫn không hoạt động.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

Sau đó tôi đã cài đặt một chrontab một vài phút trước thời điểm hiện tại và chờ đợi nó thực thi.

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

những điều này cũng không thực hiện.

Hãy tử tế để giúp tôi phát hiện ra sai lầm của mình. Có nhiều câu hỏi tương tự trên trang web này về vấn đề của tôi. Tôi đã giới thiệu nhiều câu trả lời do đó nhưng không ai trong số họ dường như giúp đỡ.


Tôi không chắc vấn đề của bạn ở đây là gì. Có phải là cron không bắt đầu bất kỳ công việc? Hoặc kịch bản không hoạt động? Với cả hai vấn đề, xin vui lòng, tham khảo nhật ký. Cron nên viết ở đâu đó để /var/log/cron*. Đối với mục đích thử nghiệm, bạn có thể chỉ cần viết một cái gì đó như */2 * * * * /path/to/script- nó sẽ chạy một kịch bản cứ sau 2 phút. Đồng thời kiểm tra thư cho người dùng đang chạy cron. Có phải là root? Sử dụng maillệnh. Ồ, tôi có thể thấy rằng bạn đang sử dụng khóa ssh? Tôi nghi ngờ rằng công việc định kỳ sẽ có thể tìm thấy nó nếu bạn không cung cấp đường dẫn đầy đủ cho nó sau khi -ichuyển đổi.
Kalavan

Câu trả lời:


8

Tôi không chắc chắn nếu sử dụng cronđể chạy một kịch bản khi khởi động là một ý tưởng tốt. Một cách khác tôi thấy phù hợp hơn là tạo một dịch vụ SystemD, như được mô tả ở đây . Tạo một tệp có tên /etc/systemd/system/autossh.service:

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

Sau đó chạy lệnh sau với quyền root:

systemctl enable autossh.service

1

Một vài điều bạn có thể thử:

chmod +x rev.sh

Đôi khi, đường dẫn của bạn không được đặt hoàn toàn vào lúc khởi động hoặc thông qua các cronjobs, vì vậy hãy thay thế autossh bằng đường dẫn đầy đủ, trên hệ thống của tôi, đó là

/usr/bin/autossh

Mô-đun @reboot phụ thuộc vào thời gian khởi động cron daemon, do đó nó có thể được gọi trước khi các hệ thống con khác (mạng?) hoạt động

Và ví dụ về crontab của bạn:

24 12 8 * * * bash /home/user/rev.sh

sẽ chỉ gọi vào ngày 8 hàng tháng. Và nó có một lĩnh vực phụ. Thử

24 12 * * * /home/user/rev.sh

xin lỗi có sự nhầm lẫn. Tôi đã thử '24 12 * * * /home/user/rev.sh 'nhưng nó vẫn hoạt động. Thật ngạc nhiên, tôi thậm chí không '24 12 * * * khởi động lại 'hoạt động.
Denis

1
Khởi động lại chắc chắn sẽ không hoạt động trừ khi bạn gọi là root.
Slowko

Tôi đã thử thêm / usr / bin / autossh. Nó không hoạt động.
Denis

Tôi đã thử khởi động lại 24 12 8 * * * trong crontab gốc. Nó không hoạt động. Nó có hoạt động trên của bạn?
Denis

/usr/binluôn ở chế độ mặc định PATH, ngay cả đối vớicron
roaima

1

Dường như, khi tập lệnh được thực thi thông qua crontab, nó không thể tìm thấy chứng chỉ của bạn.

Khi bạn là người dùng thực thi tập lệnh, nó sẽ sử dụng chứng chỉ từ /home/ubfox-user/.ssh / ... Tuy nhiên, khi tập lệnh được thực thi từ crontab, nó sẽ chạy như root. root lấy chứng chỉ từ /root/.ssh

Vì vậy, bạn có nhiều cách để làm cho nó hoạt động, nhưng tôi nghĩ rằng việc chạy tập lệnh như người dùng ub Ubuntu trong crontab sẽ làm điều đó.

Biên tập:

đảm bảo cung cấp một đường dẫn đủ điều kiện cho chứng chỉ


1

Hãy thử sử dụng su:

su -l user -c /home/user/rev.sh

Nó sẽ giúp với vấn đề của bạn?


0

vì câu hỏi không có quá nhiều dữ liệu trong đó, tôi sẽ bắt đầu từ đầu với những gì tôi sẽ làm

Tôi sẽ đặt tất cả các cấu hình trong / etc / ssh / ssh_config:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

Tôi sẽ đặt chìa khóa vào /etc/ssh/mytunnel_key

sau đó tôi sẽ thử với một mục cron (một dịch vụ mới bắt đầu / systemd sẽ tốt hơn) như thế này:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel

0

Bạn cần sử dụng -fchạy lệnh khi bạn chạy mà không có thiết bị đầu cuối. Vì vậy, đây là một ví dụ:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
user@www.hostname.com \
sleep 31536000

-f đặt nó dưới nền, nhưng đặt nó dưới nền có nghĩa là ssh sẽ kết nối, sau đó ngắt kết nối ngay khi hoàn thành nhiệm vụ. Vì vậy, bạn cần một nhiệm vụ.

ngủ 31536000 bảo ssh chạy "ngủ" trong 1 năm sau khi kết nối. Trong thời gian này, đường hầm của bạn sẽ vẫn còn.

Nếu bạn không chạy lệnh, ssh sẽ kết nối, thiết lập đường hầm ngược trên cổng 2205 và khi hoàn thành việc đó, nó sẽ thoát. Sử dụng autossh, nếu kết nối thất bại, nó sẽ kết nối lại và khởi động lại giấc ngủ. Ngay cả với một kết nối internet thực sự ổn định, tôi nghi ngờ một năm là có thể.

BTW - không giống như những người thích đùa khác, tôi biết điều này hoạt động, vì tôi thực sự đã thử nó vì dĩ nhiên tôi đang làm điều gì đó tương tự và vì tôi đã làm việc ngay bây giờ, rất đáng tin cậy, tôi có thể cho bạn câu trả lời chính xác.

-f và "lệnh"

Đó là những gì bạn đang thiếu.


1
Tôi không nghĩ chúng ta cần gọi tên người khác ở đây.
Jeff Schaller

1
Tôi không gọi tên người khác. Tôi đang chỉ ra các giải pháp được đề xuất trước đây chưa bao giờ được thử bởi những người đề xuất chúng. Đừng tin tôi? Thử chúng đi.
Jimminy Doe

1
Tôi cũng không nghĩ rằng bạn đã giải quyết được vấn đề của câu hỏi - OP tuyên bố Phương pháp này hoạt động 100% . Tôi tin rằng câu hỏi của họ xoay quanh việc chạy tập lệnh của họ theo cách tự động sau khi PC của họ khởi động lại.
Jeff Schaller

1
Nếu anh ta đang làm việc, anh ta có thể thiết lập các đường hầm ngược về nhà, vì OP đang chạy trong một thiết bị đầu cuối - THAT hoạt động 100% thời gian. Các chương trình ssh (và autossh) hoạt động khác nhau nếu chúng không có thiết bị đầu cuối liên quan đến quy trình. Anh ta gặp vấn đề với việc crontab (chạy mà không có thiết bị đầu cuối) kết nối lại các đường hầm, chính xác là vì anh ta không sử dụng -f, và ngay cả khi anh ta, ssh sẽ thoát khi đường hầm được thiết lập, mà không chạy một cái gì đó - trong trường hợp của tôi, tôi đi Chạy ngủ, trong một năm. Trong tập lệnh -f phải được sử dụng VỚI MỘT LỆNH để ngăn SSH thoát ra. Đó là vấn đề của anh ấy.
Jimminy Doe

1
Tôi cho rằng đó là bạn, Jeff Schaller, vì đã cho tôi một downvote, vì đã đưa ra giải pháp chính xác và thực sự thử nghiệm nó. Về cơ bản, tôi đang thực hiện cùng một thiết lập chính xác, ngoại trừ tôi đang thiết lập PI để vượt qua tường lửa và khởi động rdesktop, và đưa nó cho người quản lý văn phòng của chúng tôi, người không biết gì về Linux, để sử dụng nó . Khá chắc chắn tôi có một giải pháp chống đạn, vì hiện tại tôi đang sử dụng nó và tôi đã khởi động lại cả pi của mình từ xa và modem cáp cục bộ của tôi - để an toàn .. Nhưng heck, đừng để câu trả lời đúng cách của một bản ngã, không học hỏi, bản ngã.
Jimminy Doe
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.