ssh-under-cron перестає працювати в OS X 10.7 Lion


12

Щойно модернізований від Snow Leopard до Lion, і мої роботи з cron, які використовують ssh, перестали працювати. Схоже, ssh-агент більше не працює, як очікувалося.

Ось розгорнута версія мого сценарію, що дзвонив із крона, який чудово працював під 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

При запуску з командного рядка цей скрипт працює як очікувалося.

Якщо бігти з cron, він не працює. Вихід ssh-агента виглядає нормально:

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

Але ssh -vvvрезультат показує, що він не вдається, коли закритий ключ повинен бути прочитаний:

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

Іншими словами, очікує, що я введу пароль для фрази ~/.ssh/id_dsa, що, звичайно, не працює в роботі з cron.

Це все працювало у Snow Leopard.

Зверніть увагу , що у мене є налаштування зв'язки ключів доступу , так що ssh, ssh-agentі ssh-addможе прочитати мою фразу для мого .ssh/id_dsaфайлу - в результаті я можу SSH з терміналу запрошення без необхідності ввести свій пароль.

Це питання, яке мені потрібно запустити ssh-addв якийсь момент мого входу? Запуск із стандартного bash-підказки не допомагає виконувати роботу cron (хоча, як це не дивно, це підказує мені для моєї парольної фрази ... що, на мою думку, не потрібне b / c конфігурації Keychain Access).

ПРИМІТКА 1 - перед тим, як перенаправити мене - я знаю, що тут є подібне питання ( Mac OS X Lion та sshpass ), але мова йде саме про програму, sshpassяку я не використовую (хоча я вважаю, що на це питання відповів би і цей. ).

ПРИМІТКА 2 - Я розумію, що SSH-ключі без паролів вирішили б мою проблему; однак я вважаю за краще не йти цим маршрутом.


2
крон пропав. Дивіться тут тег запуску для всілякої допомоги (зробіть крок - він обробляє порти, навколишнє середовище та багато іншого, набагато краще, ніж колись це робив) - я сподіваюся, що хтось має рішення, але тут модрон cron старіє напевно .
bmike

3
Крон все ще працює в Леві ... але ти маєш рацію, я мушу зробити крок. 10+-рядовий XML-файл для роботи однієї ЛІНІЇ crontab, однак, дуже кульгавий. Можливо, через 10 років вони перемкнуть файли плістів на JSON, і вони будуть дуже радіти, і через 10 років вони повернуться до crontab, а сірі босоніжки BSD будуть сміятися. Я припускаю, що до цього часу буду сірим босом BSD ...
Джон Харт

1
Просто перейшов на запуск, працює шарм. Викликаному сценарію взагалі не потрібно взаємодіяти з ssh-агентом - ви можете просто перейти прямо в команду ssh після хешбангу. Якби ваш коментар був відповіддю, я би прийняв його =)
Джон Харт

JSON, безумовно, сяє над XML у багатьох випадках, але всі списки, які були раніше, швидше за все, змусили проблему. Мені просто галочку, що у нас є уніфікована, ефективна, структурована заміна даних. cron і, безумовно, служив нам добре протягом століть!
bmike

Я шукав високі та низькі додаткові ресурси в Інтернеті, але завжди опиняюся на цій посаді. Невже хтось має більше внести свій внесок у дискусію? Я спробував використовувати простий пліст для запуску сценарію оболонки, але потім mailx не надсилає мої сповіщення. Мені все одно подобається cron, і я його постійно використовую в Ubuntu. Я не хочу повертатися до 10.6, але це питання вбиває мене. Мені не подобається, що мене змушують використовувати startctl і мені доводиться вчитися тому, що мені здається, що це дуже розширена основа для автоматизації сценаріїв оболонок. У когось є нова інформація?

Відповіді:


10

Для всіх, хто опинився на цій сторінці, я зрозумів, що повинен розмістити відповідь:

Використання rund замість cron дійсно виправляє проблему з авторизацією. Ваші користувальницькі завдання для запуску (які виконуються лише тоді, коли ви ввійшли в систему) правильно використовують інформацію агента SSH, яка була розблокована через вашу брелок, як частину входу (як частина стандартного керування ключами X X, іншого програмного забезпечення не потрібно).

Щоб мінімізувати мою взаємодію із запуском, я створив єдине завдання запуску, яке викликає скрипт bash. Таким чином я можу просто редагувати сценарій, не маючи справи з запуском.

Ось файл запуску:

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

Я зберег файл ~/Library/LaunchAgents/com.mycron.hourly.plistі завантажив його:

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

Після завантаження він буде працювати відразу, а потім знову кожні 60 хвилин.

Якщо ви дотримуєтесь тієї ж процедури, вам потрібно змінити рядок `ProgramArguments 'правильним шляхом до вашого сценарію.


2
Дійсно, крон принаймні у Лева. Кудо для пошуку відповіді - startctl спочатку може бути важко розбити.
zwerdlds

7

Додавання наступного коду до сценарію bash shell вирішить проблему:

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

Замініть your_userвласним іменем користувача.

Цей код встановлює правильне значення для SSH_AUTH_SOCKінформування sshабо scpпро те, як спілкуватися, ssh-agentколи запускається сценарій оболонки cron.


Це вирішило проблему, яка у мене була, коли scp не працюватиме через запуск у скрипті оболонки, незважаючи на те, що він працює нормально через звичайний командний рядок (iTerm або Terminal). Відмінна порада.
TJ Luoma

Тільки для запису, на Епі Капітан 10.11.2:zsh: no matches found: /tmp/launch-*/Listeners
Іван Балашов

1

Я б очікував, що розширена безпека, як пісочниця, і зміни для подальшого переміщення речей до 64 біт викликають несподіване горе.

Це не відповідь, сама по собі, але запущена в цей час отримує всю любов від яблука.

Це не вирішує проблему з хроном, але вона стабільніша, тому що більше людей можуть допомогти у цьому.


Дуже приємна відповідь там . Дякуємо за публікацію
bmike

1

Для тих, хто зараз це знайде, намагаючись зробити цю роботу в Ель-Капітані, і все ще неохоче перетворює свою однолінійну роботу на крон у запущений сценарій, відповідь Вернера Антвейлера все ще працює, але шлях змінився. Нижче працювали для мене:

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

ПРИМІТКА : не забудьте замінити your_user на ваше ім'я користувача!

Це не дозволило б мені подати це як коментар до його відповіді, оскільки мені не вистачає репутації, але я не хотів залишати її, не оновлюючи це, оскільки це, безумовно, допомогло мені остаточно налаштувати її.

Редагування: 30 березня 2016 року

Перевіривши це деякий час, мені потрібно додати, що це працює лише після того, як агент був використаний принаймні один раз під час цього входу. Для цього достатньо створити ssh-з'єднання або запустити ssh-агент вручну. Сценарій запуску також може бути використаний, якщо ви хочете, щоб він запускався автоматично. Я створив startup.sh, який просто запускає ssh-агент, а потім скористався редактором сценаріїв, щоб зберегти .app із наступним, і додав отриманий додаток до моїх елементів входу:

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

Я зараз це вирішую, і це не найкращий спосіб. запускається, мабуть, це шлях, але для cron ви хочете встановити свій ключ ssh (із паролем) у свій брелок. Після того, як ви це зробите, просто вхід у Mac налаштовує все. Шлях сокета, який ви опублікували, знаходиться там, де вони зберігаються, якщо ВИ запускаєте ssh-агент вручну (і вводите свою парольну фразу вручну). Коли ви завантажуєте брелок, знайдіть розетку на El Cap ls /private/tmp/com.apple.launchd.*/Listeners. Вам не потрібно нічого робити, крім входу в mac.
Джо

Визначно, що запуск - це "офіційний" спосіб зробити це, але для тих, хто хоче продовжувати використовувати cron, це служить життєздатним рішенням. У моєму тестуванні простого входу в систему не було достатньо, щоб викликати функцію збереженого брелоком ключа через cron. Перелічений вами шлях, безумовно, існує. Якщо це згенеровано, як тільки ви увійдете в систему і все ще працює для cron, ймовірно, достатньо, щоб можна було пропустити вказаний я скрипт методу запуску. Безумовно, варто перевірити як мінімум - дякую!
Petie

Я поставив це на місце резервного копіювання, і він працює чисто - через перезавантаження - вже більше тижня.
Джо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.