Không thể ssh vào máy từ xa bằng cách sử dụng tập lệnh shell trong Crontab


11

Dưới đây là đoạn script mà tôi đang cố chạy, nó chạy mà không có vấn đề gì

for i in `seq 200 2100`
do
  usr=(`ssh -t -t -o ConnectTimeout=60 machine$1 finger | tail -1 | awk '{print$1}'`) 
  echo $usr
done

Nhưng một khi tôi thêm nó vào crontab, nó không cung cấp cho tôi người dùng.

22  12  *  *  *  sh /home/subrahmanyam/Scripts/who.sh

Hãy cho những suy nghĩ của bạn .....

có thể là quỷ cron đang chạy, vì vậy chúng ta cần bao gồm một số nhị phân ...?


1
Quyền bị từ chối (publickey, gssapi-keyex, gssapi-with-mic, password). Quyền bị từ chối (publickey, gssapi-keyex, gssapi-with-mic, password). Quyền bị từ chối (publickey, gssapi-keyex, gssapi-with-mic, password).

Intenesions của bạn với điều này là gì? Bạn đang cố gắng để đạt được điều gì. Để bạn biết rằng chúng tôi không thể hỗ trợ cho bất kỳ hoạt động độc hại nào nếu đó là ý định của bạn
Timothy Frew

Câu trả lời:


14

Bạn có thể tạo kết nối ssh trong một phiên cron. Những gì bạn cần là thiết lập một xác thực khóa công khai để có quyền truy cập không mật khẩu. Để làm việc này, bạn cần phải có PubkeyAuthentication yestrong mỗi máy chủ từ xa sshd_config.

Bạn có thể tạo một cặp khóa riêng / chung có hoặc không có cụm mật khẩu. Nếu bạn sử dụng cụm mật khẩu (recommented), bạn cũng cần bắt đầu ssh-agent. Nếu không có cụm mật khẩu, bạn chỉ cần thêm tham số -i your_identity_filevào sshdòng lệnh. sshsẽ sử dụng $HOME/.ssh/id_rsanhư mặc định.

Tôi đã sao chép ví dụ của bạn bằng cách sử dụng một cặp khóa với cụm mật khẩu. Đây là cách tôi đã làm nó.

1) Tạo cặp khóa với cụm mật khẩu. Đã lưu khóa riêng dưới dạng ~/.ssh/id_rsa_test, phải có quyền chính xác theo mặc định. Chúng tôi có thể nhập một cụm mật khẩu trống để không sử dụng một mật khẩu.

john@coffee:~$ ssh-keygen -N "somephrase" -f .ssh/id_rsa_test
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa_test.
Your public key has been saved in .ssh/id_rsa_test.pub.
[snip]

2) Đã gửi khóa công khai tới các máy chủ, thực hiện tương tự cho tất cả chúng. Hãy nhớ rằng họ cần phải PubkeyAuthenticationkích hoạt.

john@coffee:~$ ssh-copy-id -i .ssh/id_rsa_test server1
The authenticity of host 'server1 (11.22.33.1)' can't be established.
RSA key fingerprint is 79:e8:0d:f5:a3:33:1c:ae:f5:24:55:86:82:31:b2:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,11.22.33.1' (RSA) to the list of known hosts.
john@server1's password: 
Now try logging into the machine, with "ssh 'server1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

3) Chạy ssh-agent như dịch vụ với -s. Điều này sẽ không giết nó nếu bạn đăng xuất. Đầu ra của nó là một tập lệnh shell hợp lệ, thiết lập môi trường để ssh client sẽ biết cách kết nối với nó. Chúng tôi lưu nó vào một tập tin (chỉ dòng đầu tiên là thực sự cần thiết).

john@coffee:~$ ssh-agent -s | head -n 1 > ssh-agent.cf 
john@coffee:~$ cat ssh-agent.cf 
SSH_AUTH_SOCK=/tmp/ssh-VhyKL22691/agent.22691; export SSH_AUTH_SOCK;

4) Đã tải ở trên vào môi trường hiện tại của chúng tôi để chúng tôi có thể sử dụng ssh-addđể thêm khóa riêng của mình vào ssh-agent. cụm mật khẩu từ trên.

john@coffee:~$ source ssh-agent.cf 
john@coffee:~$ ssh-add  .ssh/id_rsa_test
Enter passphrase for .ssh/id_rsa_test: 
Identity added: .ssh/id_rsa_test (.ssh/id_rsa_test)

5) Xác nhận nó được thêm vào.

john@coffee:~$ ssh-add -l
2048 96:58:94:67:da:67:c0:5f:b9:0c:40:9b:52:62:55:6a .ssh/id_rsa_test (RSA)

6) Kịch bản tôi đã sử dụng, sửa đổi một chút so với của bạn. Lưu ý rằng tôi đã không đặt lệnh ssh trong ngoặc đơn và không sử dụng backticks $(), đây là cách thay thế tốt hơn để thay thế lệnh (điều này bashtương thích, bạn không đề cập đến việc bạn đang sử dụng shell nào). Tôi đã sử dụng chính xác lệnh ssh như của bạn.

john@coffee:~$ cat foo.sh 
#!/bin/bash

source /home/john/ssh-agent.cf
for server in server1 server2; do
    usr=$(ssh -t -t -o ConnectTimeout=60 $server finger | tail -1 | awk '{print $1}')
    date=$(ssh -o ConnectTimeout=60 $server date)
    echo "$server - $date - $usr" >> /home/john/foo.log
done

7) Crontab của tôi (lưu ý rằng tôi shthực sự bash)

john@coffee:~$ crontab -l
# m h  dom mon dow   command
*/1  *  *  *  *  sh /home/john/foo.sh

8) Đầu ra

john@coffee:~$ tail -n 4 foo.log
server1 - Wed Mar 23 14:12:03 EET 2011 - john
server2 - Wed Mar 23 14:12:04 EET 2011 - john
server1 - Wed Mar 23 14:13:03 EET 2011 - john
server2 - Wed Mar 23 14:13:04 EET 2011 - john

Vấn đề duy nhất khi sử dụng cụm mật khẩu là bạn cần nhập thủ công ít nhất một lần. Vì vậy, ở trên sẽ không tự động hoạt động sau khi khởi động lại.


Tuyệt vời - cảm ơn. Tôi có thể sống với không có tự động khởi động lại sau khi khởi động lại ít nhất.
Peter Mounce

Sử dụng ssh-cron để thiết lập các kết nối SSH được lên lịch tới các máy chủ an toàn mà không để lộ các khóa SSH của bạn, nhưng sử dụng tác nhân SSH. unix.stackexchange.com/questions/8903/ Cách
Luchostein

4

Ai gõ mật khẩu? Công việc định kỳ không thể nhận được tại đại lý ssh của bạn, vì vậy khóa công khai sẽ không hoạt động.

Bạn cần cung cấp sshmột tệp chính một cách rõ ràng (xem -itùy chọn), vì nó không thể truy vấn một tác nhân; và khóa đó phải có cụm mật khẩu trống.


Đã thử bằng cách chuyển tên người dùng và mật khẩu quá - ssh -t -t -o ConnectTimeout = 60 user @ machine $ 1 finger | đuôi -1 | awk '{print $ 1}' </ home / user / passwd ---- ý tôi là thư mục nhà nằm trên NFS, vì vậy nó gắn kết với everymachine

Nếu ssh có bất kỳ ý nghĩa nào, nó sử dụng /dev/ttyđể đọc mật khẩu thay vì stdin; Điều đó sẽ không làm việc từ cron.
geekizard

Đã thử đưa ra tùy chọn -i nhưng không có may mắn! ---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/ Unknown_hosts máy $ 1 ngón tay | đuôi -1 | awk '{print $ 1}' ------ CẢNH BÁO: FILE KEY RIÊNG TƯ KHÔNG GIỚI HẠN! Quyền 0640 cho '/home/user/.ssh/ Unknown_hosts' quá mở. Người khác không nên truy cập các tệp khóa riêng của bạn. Khóa riêng này sẽ bị bỏ qua. quyền xấu: bỏ qua khóa:

Tại sao nó phàn nàn về known_hosts? Nhưng có, bạn cần coi chừng các quyền - tệp khóa riêng phải là chế độ 0600 hoặc thậm chí 0400, do bạn sở hữu. Nếu bạn cần một số người dùng khác để có thể sử dụng nó, bạn sẽ xem xét các POSIX ACL hoặc tương tự.
geekizard

Nghĩ về nó, tôi thấy GSSAPI được cung cấp trong đó vì vậy một khả năng khác là lấy keytab và sử dụng nó để kinitbên trong công việc định kỳ. Điều đó nói rằng, keytabs cũng yêu cầu sự chăm sóc tương tự trong các quyền; nhưng sshít nhất sẽ không phàn nàn về họ.
geekizard

1

Thay vì lưu trữ một tệp tạm thời như Forcefsck đã làm, tôi thích sử dụng findđể tìm kiếm trên tác nhân hoạt động.

Tại chủ đề của một kịch bản cần ssh-agent, tôi sử dụng:

export SSH_AUTH_SOCK=$(find /run/user/$(id -u)/ -mindepth 2 -maxdepth 2 -path '*keyring-*' -name 'ssh' -print -quit 2>/dev/null)

Nó tìm kiếm ssh-agentổ cắm và trả về cái đầu tiên. Nó chỉ được giới hạn cho người dùng hiện tại, do đó bạn sẽ không vô tình thử sử dụng người dùng khác và nhận được lỗi từ chối cấp phép. Bạn cũng cần phải đăng nhập bằng một hoạt động ssh-agent. (Ubuntu khởi động một tác nhân khi GUI khởi động).

Nếu bạn đặt tập lệnh này trong tập lệnh khác, bạn sẽ cần gọi nó bằng sourcehoặc .vì nó cần đặt SSH_AUTH_SOCKbiến.


0

Sử dụng ssh-cron để thiết lập các kết nối SSH được lên lịch tới các máy chủ an toàn mà không để lộ các khóa SSH của bạn, nhưng sử dụng tác nhân SSH.


0

Bạn có thể chạy tập lệnh hoặc lệnh của bạn trong crontab như:

0 * * * * bash -c -l "/home/user/sshscript.sh"

hoặc là

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"
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.