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


12

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 키가 내 문제를 해결할 수 있음을 알고 있습니다. 그러나 나는이 길을 가고 싶지 않다.


2
크론이 사라졌습니다. 모든 종류의 도움에 대해서는 여기에서 시작된 태그를 참조하십시오 (이동을하십시오-포트를 처리하고 환경과 cron보다 훨씬 더 잘 처리합니다). 나는 누군가가 해결책을 가지고 있기를 희망하지만 여기서 cron mojo는 특정 기간 동안 노화되고 있습니다 .
bmike

3
cron은 여전히 ​​Lion에서 실행되지만 ... 그렇습니다. crontab의 단일 LINE 작업을 수행하기위한 10 개 이상의 라인 XML 파일은 상당히 절실합니다. 아마도 10 년 안에 plist 파일을 JSON으로 전환 할 것이고, 기뻐할 것이 많고, 10 년 후에는 crontab으로 돌아가고 BSD greybeards가 웃을 것입니다. 나는 그때까지 내가 BSD greybeard가 될 것 같아요
John Hart

1
런칭으로 전환하고 매력을 발휘합니다. 호출 된 스크립트는 ssh-agent와 전혀 상호 작용할 필요가 없습니다. 해시 뱅 다음에 ssh 명령으로 바로 이동할 수 있습니다. 당신의 의견이 답이라면, 나는 그것을 받아 들일 것입니다 =)
John Hart

JSON은 분명히 많은 경우 XML보다 뛰어나지 만 이전에 나온 모든 plist가 문제를 강요했을 것입니다. 우리는 통합되고 효율적이며 구조화 된 데이터 기반 교체 기능을 사용하고 있습니다. cron과 확실히 우리를 오랫동안 봉사했다!
bmike

추가 웹 리소스를 찾기 위해 높고 낮게 검색했지만 항상이 게시물로 돌아갑니다. 분명히 누군가가 토론에 더 많은 기여를합니까? 쉘 스크립트를 실행하기 위해 간단한 plist를 사용하려고 시도했지만 mailx는 알림을 보내지 않습니다. 나는 여전히 cron을 좋아하고 우분투에서 항상 사용합니다. 10.6으로 돌아가고 싶지 않지만이 문제로 인해 나를 죽이고 있습니다. 나는 launchctl을 사용하고 셸 스크립트를 기본적으로 자동화하는 매우 광범위한 프레임 워크와 같은 느낌을 배우는 것을 좋아하지 않습니다. 새로운 통찰력이 있습니까?

답변:


10

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

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 '문자열을 변경하고 싶을 것입니다.


2
실제로, 크론은 적어도 라이온에서는 더 이상 사용되지 않습니다. 답을 찾는 것에 대한 조언-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를 시작하여 scp가 작동하지 않는 문제를 해결했습니다. 훌륭한 팁.
TJ Luoma

엘 캡틴 10.11.2의 기록에 대해서만 :zsh: no matches found: /tmp/launch-*/Listeners
Ivan Balashov

1

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

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

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


거기에 아주 좋은 답변 입니다. 게시 해 주셔서 감사합니다.
bmike

1

엘 캐피 탄 에서이 작업을 수행하려고 노력하고 여전히 한 줄 크론 작업을 시작된 스크립트로 바꾸는 것을 꺼려하는 사람이라면 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"

지금이 문제를 해결하고 있으며 이것이 최선의 방법은 아닙니다. 분명히 시작하는 방법이지만 cron의 경우 키 체인에 ssh 키 (암호 포함)를 설정하려고합니다. 일단 완료하면 Mac에 로그인하면 모든 것이 설정됩니다. 게시 한 소켓 경로는 ssh-agent를 수동으로 실행하고 암호를 수동으로 입력하면 유지되는 위치입니다. El Cap에서 키 체인이로드되면를 통해 소켓을 찾으십시오 ls /private/tmp/com.apple.launchd.*/Listeners. mac에 로그인하는 것 외에는 아무것도하지 않아도됩니다.
joe

"공식적인"방법으로 시작했지만 cron을 계속 사용하려는 사람들에게는 이것이 실용적인 해결책으로 작용합니다. 필자의 테스트에서 단순히 로그인하는 것만으로는 키론으로 저장된 키가 cron을 통해 작동하지 못했습니다. 당신이 나열된 경로는 분명히 존재합니다. 로그인하자마자 생성되어 여전히 cron에서 작동한다면 나열된 시작 스크립트 방법을 건너 뛸 수있을 것입니다. 적어도 테스트할만한 가치가 있습니다-감사합니다!
Petie

백업 프로세스를 위해이 작업을 수행했으며 지금은 1 주일 이상 재부팅을 통해 깨끗하게 실행되고 있습니다.
joe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.