ssh-under-cron ngừng hoạt động trong OS X 10.7 Lion


12

Chỉ cần nâng cấp từ Snow Leopard lên Lion, và các công việc định kỳ của tôi sử dụng ssh đã ngừng hoạt động. Dường như ssh-agent không còn hoạt động như mong đợi.

Đây là phiên bản được cải tiến của kịch bản được gọi là từ cron của tôi hoạt động rất tốt trong Snow Leopard:

#!/bin/bash
whoami # just to verify I'm running as myself, not root
ssh-agent # just to see what it outputs    
eval `ssh-agent`
ssh -vvv REMOTESERVER ls

Khi chạy từ dấu nhắc lệnh, tập lệnh này hoạt động như mong đợi.

Khi chạy từ cron, nó không hoạt động. Đầu ra ssh-agent trông bình thường:

SSH_AUTH_SOCK=/tmp/ssh-QRxPUMRxbu/agent.17147; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17148; export SSH_AGENT_PID;
echo Agent pid 17148;
Agent pid 17150

Nhưng ssh -vvvđầu ra cho thấy nó bị lỗi ngay khi đọc khóa riêng:

debug1: Server accepts key: pkalg ssh-dss blen 818
debug2: input_userauth_pk_ok: fp ...
debug3: sign_and_send_pubkey: DSA ...
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: Device not configured
debug2: no passphrase given, try next key

Nói cách khác, nó hy vọng tôi gõ cụm mật khẩu cho ~/.ssh/id_dsa, tất nhiên điều này không hoạt động trong các công việc định kỳ.

Tất cả điều này đã làm việc trong Snow Leopard.

Lưu ý rằng tôi đã có thiết lập Keychain Access để ssh, ssh-agentssh-addđược phép đọc cụm từ mật khẩu của tôi cho tôi .ssh/id_dsatập tin - kết quả là tôi có thể SSH từ một dấu nhắc terminal mà không bao giờ cần phải nhập cụm từ mật khẩu của tôi.

Đây có phải là vấn đề mà tôi cần phải chạy ssh-addtại một số điểm trong quá trình đăng nhập của mình không? Chạy nó từ một dấu nhắc bash tiêu chuẩn không giúp ích cho công việc định kỳ (mặc dù, thật kỳ lạ, nó nhắc tôi cho cụm mật khẩu của tôi ... mà tôi nghĩ là không cần thiết b / c của cấu hình Keychain Access).

CHÚ THÍCH 1 - trước khi chuyển hướng cho tôi - Tôi biết có một câu hỏi tương tự ở đây ( Mac OS X Lion và sshpass ) nhưng cụ thể là về một chương trình sshpassmà tôi không sử dụng (mặc dù tôi tin rằng câu hỏi này cũng sẽ được trả lời bởi câu hỏi này ).

LƯU Ý 2 - Tôi nhận ra rằng các khóa SSH không có cụm mật khẩu sẽ giải quyết vấn đề của tôi; tuy nhiên tôi không muốn đi theo con đường này


2
cron đã biến mất Xem thẻ launchd ở đây để biết tất cả các loại trợ giúp (hãy thực hiện di chuyển - nó xử lý các cổng, môi trường và tốt hơn rất nhiều so với cron từng làm) - Tôi hy vọng ai đó có giải pháp, nhưng cron mojo ở đây đang già đi .
bmike

3
Cron vẫn chạy trong Lion ... nhưng bạn nói đúng, tôi nên di chuyển. Mặc dù vậy, một tệp XML hơn 10 dòng để thực hiện công việc của một LINE crontab là khá khập khiễng. Có thể sau 10 năm nữa, họ sẽ chuyển các tệp plist sang JSON và sẽ có rất nhiều niềm vui, và 10 năm sau họ sẽ quay lại crontab, và những người yêu thích BSD sẽ cười. Tôi cho rằng lúc đó tôi sẽ là một người xám BSD ...
John Hart

1
Chỉ cần chuyển sang launchd, hoạt động một sự quyến rũ. Tập lệnh được gọi hoàn toàn không cần tương tác với ssh-agent - bạn có thể chỉ cần nhảy thẳng vào lệnh ssh sau hàm băm. Nếu bình luận của bạn là một câu trả lời, tôi sẽ chấp nhận nó =)
John Hart

JSON chắc chắn tỏa sáng trên XML trong nhiều trường hợp, nhưng tất cả các ý tưởng xuất hiện trước đó có khả năng đã buộc vấn đề này. Tôi chỉ tích tắc chúng tôi có một sự thay thế dựa trên dữ liệu thống nhất, hiệu quả, có cấu trúc. cron và chắc chắn phục vụ chúng tôi tốt cho các lứa tuổi!
bmike

Tôi đã tìm kiếm cao và thấp cho các tài nguyên web bổ sung nhưng tôi luôn luôn quay lại bài đăng này. Chắc chắn ai đó có nhiều hơn để đóng góp cho các cuộc thảo luận? Tôi đã cố gắng sử dụng một plist đơn giản để chạy tập lệnh shell của mình nhưng sau đó mailx không gửi thông báo của tôi. Tôi vẫn thích cron và tôi sử dụng nó trong Ubuntu mọi lúc. Tôi không muốn quay lại 10.6 nhưng vấn đề này đang giết chết tôi. Tôi không thích bị ép buộc sử dụng launchctl và phải học những gì cảm thấy với tôi như một khung rất rộng để cơ bản tự động hóa các kịch bản shell. Bất cứ ai có bất kỳ hiểu biết mới?

Câu trả lời:


10

Đối với bất kỳ ai kết thúc trên trang này, tôi nhận ra rằng tôi nên đăng câu trả lời:

Sử dụng launchd thay vì cron thực sự khắc phục vấn đề ủy quyền. Các công việc launchd của người dùng của bạn (chỉ chạy khi bạn đăng nhập) sử dụng chính xác thông tin tác nhân SSH đã được mở khóa thông qua khóa của bạn như một phần của đăng nhập (như một phần của quản lý khóa OS X tiêu chuẩn, không yêu cầu phần mềm nào khác).

Để giảm thiểu các tương tác của tôi với launchd, tôi đã tạo một công việc launchd duy nhất gọi một tập lệnh bash. Bằng cách này, tôi có thể chỉ cần chỉnh sửa tập lệnh mà không phải xử lý launchd.

Đây là tập tin launchd:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.mycron.hourly</string>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/john/bin/cron.hourly</string>
  </array>

  <key>Nice</key>
  <integer>1</integer>

  <key>StartInterval</key>
  <integer>3600</integer> <!-- start every X seconds -->

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Tôi đã lưu tệp vào ~/Library/LaunchAgents/com.mycron.hourly.plistvà sau đó tải nó bằng:

launchctl load ~/Library/LaunchAgents/com.mycron.hourly.plist

Sau khi tải, nó sẽ chạy ngay lập tức và sau đó cứ sau 60 phút.

Nếu bạn làm theo quy trình tương tự, bạn sẽ muốn thay đổi chuỗi `ProgramArgument 'với đường dẫn đúng tới tập lệnh của bạn.


2
Thật vậy, cron bị phản đối ít nhất là trong Lion. Kudos cho việc tìm câu trả lời - launchctl có thể khó đột nhập vào ban đầu.
zwerdlds

7

Thêm mã sau vào tập lệnh bash shell của bạn sẽ khắc phục vấn đề:

declare -x SSH_AUTH_SOCK=$( find /tmp/launch-*/Listeners -user your_user -type s | head -1 )

Thay thế your_userbằng tên người dùng của riêng bạn.

Mã này đặt giá trị chính xác cho SSH_AUTH_SOCKthông báo đó sshhoặc scpvề cách giao tiếp ssh-agentkhi tập lệnh shell được khởi động cron.


Điều này đã giải quyết vấn đề mà tôi gặp phải khi scp không hoạt động thông qua launchd trong tập lệnh shell mặc dù nó hoạt động tốt thông qua dòng lệnh thông thường (iTerm hoặc Terminal). Mẹo tuyệt vời.
TJ Luoma

Chỉ để ghi lại, trên El Captain 10.11.2:zsh: no matches found: /tmp/launch-*/Listeners
Ivan Balashov

1

Tôi mong đợi bảo mật được tăng cường như hộp cát và các thay đổi để tiếp tục di chuyển mọi thứ lên 64 bit đang gây ra sự đau buồn bất ngờ.

Đó không phải là một câu trả lời, mỗi ngày, nhưng launchd đang nhận được tất cả tình yêu từ táo ngày nay.

Nó không khắc phục vấn đề cron, nhưng ổn định hơn cũng như nhiều người có thể giúp đỡ hơn.


Câu trả lời rất hay đấy . Cảm ơn đã đăng nó.
bmike

1

Đối với bất cứ ai tìm thấy điều này bây giờ, cố gắng thực hiện công việc này ở El Capitan, và vẫn miễn cưỡng biến công việc cron một dòng của bạn thành kịch bản khởi động, câu trả lời của Werner Antweiler vẫn hoạt động nhưng đường dẫn đã thay đổi. Dưới đây làm việc cho tôi:

declare -x SSH_AUTH_SOCK=$(find /var/folders/*/*/*/*/agent.* -user your_user -type s | head -1)

LƯU Ý : hãy nhớ thay your_user bằng tên người dùng của bạn!

Nó sẽ không cho phép tôi gửi bình luận này như một bình luận về câu trả lời của anh ấy vì tôi thiếu danh tiếng nhưng tôi không muốn rời xa cô ấy mà không cập nhật điều này vì cuối cùng nó đã giúp tôi thiết lập nó.

Chỉnh sửa: ngày 30 tháng 3 năm 2016

Sau khi thử nghiệm điều này một lúc, tôi cần thêm rằng nó chỉ hoạt động khi tác nhân đã được sử dụng ít nhất một lần trong lần đăng nhập đó. Bắt đầu một kết nối ssh hoặc chạy ssh-agent thủ công là đủ để làm điều đó. Một kịch bản khởi động cũng có thể được sử dụng nếu bạn muốn nó chạy tự động. Tôi đã tạo một startup.sh chỉ chạy ssh-agent và sau đó sử dụng Script Editor để lưu một .app với phần sau và thêm ứng dụng kết quả vào các mục đăng nhập của tôi:

do shell script "/path/to/startup.sh"

Tôi đang giải quyết vấn đề này ngay bây giờ và đây không phải là cách tốt nhất. launchd rõ ràng là cách để đi, nhưng đối với cron, bạn muốn thiết lập khóa ssh của bạn (với cụm mật khẩu) trong móc khóa của bạn. Khi bạn đã hoàn thành việc đó, chỉ cần đăng nhập vào Mac sẽ thiết lập mọi thứ. Đường dẫn ổ cắm bạn đã đăng là nơi chúng được giữ nếu BẠN chạy ssh-agent theo cách thủ công (và nhập cụm mật khẩu của bạn theo cách thủ công). Trên El Cap, một khi móc khóa được tải, hãy tìm ổ cắm qua ls /private/tmp/com.apple.launchd.*/Listeners. Bạn không phải làm bất cứ điều gì ngoại trừ đăng nhập vào mac.
joe

launchd chắc chắn là cách "chính thức" để làm điều đó nhưng đối với những người muốn tiếp tục sử dụng cron, thì đây là một cách giải quyết khả thi. Trong thử nghiệm của tôi, chỉ cần đăng nhập là không đủ để khiến khóa được lưu bằng móc khóa hoạt động thông qua cron. Con đường bạn liệt kê chắc chắn tồn tại mặc dù. Nếu điều đó được tạo ngay khi bạn đăng nhập và vẫn hoạt động cho cron, thì có khả năng là có thể bỏ qua phương thức tập lệnh khởi động mà tôi đã liệt kê. Chắc chắn giá trị thử nghiệm ít nhất - cảm ơn!
Petie

Tôi đã áp dụng điều này cho một quy trình sao lưu và nó đang hoạt động sạch sẽ - qua các lần khởi động lại - trong hơn một tuần nay.
joe
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.