ssh-under-cron이 OS X 10.7 Lion에서 작동을 멈춤 blen 818 debug2:

Snow Leopard에서 Lion으로 방금 업그레이드했으며 ssh를 사용하는 cron 작업이 작동을 멈췄습니다. ssh-agent가 더 이상 예상대로 작동하지 않는 것 같습니다.

Snow Leopard에서 훌륭하게 작동하는 호출 된 크론 스크립트의 bowdlerized 버전은 다음과 같습니다.

#!/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 작업에서는 작동하지 않습니다.

이 모든 것은 스노우 레오파드에서 일했습니다.

키 체인 액세스 설정을 ssh통해 ssh-agent, 및 파일에 ssh-add대한 암호를 읽을 .ssh/id_dsa수 있습니다. 결과적으로 암호를 입력하지 않고도 터미널 프롬프트에서 SSH를 사용할 수 있습니다.

ssh-add로그인 프로세스의 어느 시점에서 실행해야하는이 문제가 있습니까? 표준 bash 프롬프트에서 실행해도 cron 작업이 도움이되지는 않지만 (이상하게도 암호 문구를 묻는 메시지가 표시됩니다 … Keychain Access 구성의 b / c가 필요하지 않다고 생각합니다).

참고 1-리디렉션하기 전에-여기 비슷한 질문이 있다는 것을 알고 있습니다 (
Mac OS X Lion 및 sshpass ). 특히 sshpass사용하지 않는 프로그램 에 관한 것입니다. ).

참고 2-암호가없는 SSH 키가 내 문제를 해결할 수 있음을 알고 있습니다. 그러나 나는이 길을 가고 싶지 않다.



답변

이 페이지에 나오는 사람은 답을 게시해야한다는 것을 깨달았습니다.

cron 대신 launchd를 사용하면 실제로 인증 문제가 해결됩니다. 사용자가 시작한 작업 (로그인 한 경우에만 실행)은 로그인의 일부로 표준 OS X 키 관리의 일부로 다른 소프트웨어가 필요하지 않은 키 체인을 통해 잠금 해제 된 SSH 에이전트 정보를 올바르게 사용합니다.

실행과의 상호 작용을 최소화하기 위해 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 ‘문자열을 변경하고 싶을 것입니다.


답변

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


답변

샌드 박스와 같은 향상된 보안 기능과 64 비트로 추가 이동 변경으로 인해 예기치 않은 슬픔이 발생합니다.

그 자체로 답은 아니지만 요즘 애플에서 사랑을 받고 있습니다.

그것은 cron 문제를 해결하지는 않지만 더 안정적이며 더 많은 사람들이 도울 수 있습니다.


답변

엘 캐피 탄 에서이 작업을 수행하려고 노력하고 여전히 한 줄 크론 작업을 시작된 스크립트로 바꾸는 것을 꺼려하는 사람이라면 Werner Antweiler의 대답은 여전히 ​​작동하지만 경로는 변경되었습니다. 아래는 나를 위해 일했습니다.

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

참고 : your_user를 사용자 이름으로 바꾸십시오.

나는 평판이 부족하기 때문에 그의 대답에 대한 의견으로 이것을 제출하도록 허용하지는 않았지만, 마침내 그것을 설정하는 데 도움이되었으므로 이것을 업데이트하지 않고 그녀를 떠나고 싶지 않았습니다.

편집 : 2016 년 3 월 30 일

이것을 잠시 테스트 한 후에는 해당 로그인 중에 에이전트가 한 번 이상 사용 된 후에 만 ​​작동한다는 점을 추가해야합니다. ssh 연결을 시작하거나 ssh-agent를 수동으로 실행하면 충분합니다. 시작 스크립트를 자동으로 실행하려는 경우에도 사용할 수 있습니다. 방금 ssh-agent를 실행하는 startup.sh를 만든 다음 스크립트 편집기를 사용하여 .app를 다음과 함께 저장하고 결과 앱을 로그인 항목에 추가했습니다.

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


답변