OS X 10.7 Lionでssh-under-cronが動作しなくなる


12

Snow LeopardからLionにアップグレードしたところ、sshを使用するcronジョブが機能しなくなりました。ssh-agentは期待どおりに機能していないようです。

以下は、Snow Leopardの下でうまく機能した、cronから呼び出されたスクリプトのバウドラー化されたバージョンです。

#!/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-agentの出力は正常に見えます。

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で機能しました。

私はそのようキーチェーンアクセスのセットアップを持っていることに注意してくださいsshssh-agentssh-add私のための私のパスフレーズを読み取ることが許可されている.ssh/id_dsa結果として、私が今まで私のパスフレーズを入力することなく、端末プロンプトからのSSHことができます-ファイル。

この問題ssh-addは、ログインプロセスのある時点で実行する必要がありますか?標準のbashプロンプトからそれを実行しても、cronジョブは実行されません(ただし、奇妙なことに、パスフレーズの入力が求められます...キーチェーンアクセス構成のb / cは不要だと思います)。

注1-私をリダイレクトする前に-私はここに同様の質問があることを知っています( Mac OS X Lionとsshpass)が、それは特にsshpass私が使用していないプログラムに関するものです(私はその質問もこの質問によって答えられると信じていますが)。

注2-パスフレーズなしのSSHキーで問題が解決することを認識しています。しかし、私はこのルートに行きたくないのです。


2
cronはなくなりました。あらゆる種類のヘルプについては、ここでlaunchdタグを参照してください(移動してください-ポート、環境、およびcronよりもはるかに優れています)誰かに解決策があることを願っていますが、ここのcron mojoは特定の年齢層です。
bmike

3
cronはまだLionで実行されています...しかし、あなたは正しい、私は移動する必要があります。ただし、1行のcrontabの作業を行うための10行以上のXMLファイルは、かなり不十分です。たぶん10年後にはplistファイルをJSONに切り替えて大いに喜ぶでしょう。10年後にはcrontabに戻り、BSD greybeardsは笑います。私は...私はそれまでにBSDの老いになるだろうと仮定
ジョン・ハート

1
launchdに切り替えただけで、魅力的です。呼び出されたスクリプトは、ssh-agentと対話する必要はまったくありません。hashbangの後、sshコマンドに直接ジャンプできます。あなたのコメントが答えであれば、私はそれを受け入れます=)
ジョンハート

多くの場合、JSONは確かにXMLよりも優れていますが、以前に登場したすべてのリストが問題を引き起こした可能性があります。統合された、効率的で、構造化されたデータベースの置換があります。cronと確かに長い間私たちに役立った!
bmike

私は、追加のWebリソースを探していましたが、常にこの投稿に戻ってきました。きっと誰かが議論に貢献してくれるでしょうか?単純なplistを使用してシェルスクリプトを実行しようとしましたが、mailxは通知を送信しません。私は今でもcronが好きで、Ubuntuで常に使用しています。10.6に戻りたくありませんが、この問題は私を殺します。launchctlの使用を余儀なくされ、基本的にシェルスクリプトを自動化する非常に拡張性のあるフレームワークのように感じるものを学ぶ必要はありません。誰にも新しい洞察がありますか?

回答:


10

このページで終わる人のために、私は答えを投稿する必要があることに気付きました:

cronの代わりにlaunchdを使用すると、実際に認証の問題が修正されます。ユーザーが起動したジョブ(ログイン時にのみ実行)は、ログインの一部としてキーチェーンを介してロック解除されたSSHエージェント情報を正しく使用します(標準OS Xキー管理の一部として、他のソフトウェアは不要です)。

launchdとの対話を最小限にするために、bashスクリプトを呼び出す単一のlaunchdジョブを作成しました。このようにして、launchdを処理せずにスクリプトを簡単に編集できます。

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>

ファイルをに保存し~/Library/LaunchAgents/com.mycron.hourly.plist、次のコマンドでロードしました。

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

ロードされると、すぐに実行され、その後60分ごとに実行されます。

同じ手順に従う場合は、スクリプトへの正しいパスで「ProgramArguments」文字列を変更する必要があります。


2
実際、少なくともLionではcronは非推奨です。答えを見つけることに対する称賛-launchctlは、最初に侵入するのが難しい場合があります。
-zwerdlds

7

次のコードをbashシェルスクリプトに追加すると、問題が修正されます。

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

your_user独自のユーザー名に置き換えます。

このコードは、シェルスクリプトがから開始されたときにSSH_AUTH_SOCK通知する方法sshまたはscp通信方法について正しい値を設定します。ssh-agentcron


これにより、通常のコマンドライン(iTermまたはTerminal)で正常に動作しているにもかかわらず、scpがシェルスクリプトのla​​unchdで動作しないという問題が解決しました。素晴らしいヒント。
TJルオマ

記録のために、エルキャプテン10.11.2で:zsh: no matches found: /tmp/launch-*/Listeners
イヴァンバラショフ

1

サンドボックスなどのセキュリティが強化され、物事をさらに64ビットに移行する変更が予期せぬ悲しみを引き起こしていることを期待します。

それ自体は答えではありませんが、launchdは最近アップルからすべての愛を獲得しています。

cronの問題を修正するわけではありませんが、より安定しており、より多くの人々がそれを支援できます。


とてもいい答えです。投稿してくれてありがとう。
bmike

1

エルキャピタンでこれを見つけようとしていて、1行のcronジョブを起動スクリプトに変更することに消極的である今、これを見つけた人にとっては、Werner Antweilerの答えはまだ機能しますが、道は変わりました。以下は私のために働いた:

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

:your_userは必ずユーザー名に置き換えてください!

私は評判に欠けているので、これを彼の答えのコメントとして提出することはできませんが、これを更新せずに彼女を去りたくありませんでした。

編集: 2016年3月30日

これをしばらくテストした後、ログイン中にエージェントが少なくとも1回使用された場合にのみ機能することを追加する必要があります。ssh接続を開始するか、ssh-agentを手動で実行するだけで十分です。起動スクリプトは、自動的に実行する場合にも使用できます。ssh-agentを実行するだけのstartup.shを作成し、スクリプトエディターを使用して.appを次の内容で保存し、結果のアプリをログイン項目に追加しました。

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

私は今これを解決していますが、これは最善の方法ではありません。どうやらlaunchdが道のりのようですが、cronの場合、キーチェーンに(パスフレーズを使用して)sshキーを設定する必要があります。それが完了したら、Macにログインするだけですべてが設定されます。投稿したソケットパスは、ssh-agentを手動で実行した場合(およびパスフレーズを手動で入力した場合)に保持される場所です。El Capで、キーチェーンが読み込まれたら、を介してソケットを見つけますls /private/tmp/com.apple.launchd.*/Listeners。Macへのログイン以外は何もする必要はありません。
joe

launchdは間違いなく「公式」な方法ですが、cronを使い続けたい人にとっては、これは実行可能な回避策として役立ちます。私のテストでは、単にログインするだけではキーチェーンに保存されたキーがcron経由で機能するのに十分ではありませんでした。リストしたパスは間違いなく存在します。ログインしてすぐに生成され、まだcronで機能する場合は、リストしたスタートアップスクリプトメソッドをスキップできれば十分でしょう。少なくともテストする価値はあります-ありがとう!
ペティ

バックアッププロセスのためにこれを配置しました。1週間以上、再起動後も正常に実行されています。
joe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.