ssh-under-cron OS X 10.7 Lion'da çalışmayı durdurdu


12

Snow Leopard'dan Lion'a yükseltme yaptım ve ssh kullanan cron işlerim artık çalışmıyor. Görünüşe göre ssh-agent artık beklendiği gibi çalışmıyor.

İşte, Snow Leopard altında harika çalışan cron denen komut dosyamın bowdlerize edilmiş bir sürümü:

#!/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

Komut isteminden çalıştırıldığında, bu komut dosyası beklendiği gibi çalışır.

Cron'dan çalıştırıldığında işe yaramıyor. Ssh-agent çıkışı normal görünüyor:

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

Ancak ssh -vvvçıktı, özel anahtarın okunması gerektiğinde başarısız olduğunu gösterir:

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

Başka bir deyişle, ~/.ssh/id_dsaelbette cron işlerinde çalışmayan parolayı yazmamı bekliyorum .

Bütün bunlar Snow Leopard'da çalıştı.

O kadar Anahtarlık Erişim kurulum var olduğunu Not ssh, ssh-agentve ssh-addbenim için benim parola okumak için izin verilir .ssh/id_dsaşimdiye benim parolayı girmek zorunda kalmadan bir terminal istemi gelen SSH bir sonucu olarak - dosyada.

ssh-addGiriş işlemimin bir noktasında çalıştırmam gereken bu sorun mu? Standart bir bash komut isteminden çalıştırmak cron işine yardımcı olmaz (garip bir şekilde, parolamı istememi ister ... ki bu anahtarlık erişim yapılandırmasının gerekli olmadığını düşünüyorum).

NOT 1 - beni yönlendirmeden önce - Burada benzer bir soru olduğunun farkındayım ( Mac OS X Lion ve sshpass ) ama özellikle sshpasskullanmadığım bir programla ilgili (bu sorunun bu soru tarafından da cevaplanacağına inanıyorum) ).

NOT 2 - Parola içermeyen SSH anahtarlarının sorunumu çözeceğini anlıyorum; ancak bu rotaya gitmemeyi tercih ederim.


2
cron gitti. Her türlü yardım için buradaki launchd etiketine bakın (hareketi yapın - bağlantı noktalarını, çevreyi ve şimdiye kadar crondan çok daha iyi idare eder) - Umarım birinin bir çözümü vardır, ancak burada cron mojo kesin yaşlanıyor .
bmike

3
cron hala Lion'da koşuyor ... ama haklısın, harekete geçmeliyim. Yine de 10+ satır XML dosyası crontab tek bir LINE çalışması yapmak için oldukça topal olsa da. Belki 10 yıl içinde plist dosyalarını JSON'a geçirecekler ve çok sevinçli olacaklar ve bundan 10 yıl sonra crontab'a geri dönecekler ve BSD greybeards gülecek. Sanırım o zamana kadar BSD greybeard olacağım ...
John Hart

1
Sadece fırlatıma geçti, bir cazibe çalışıyor. Aranan komut dosyasının ssh-agent ile hiç etkileşime girmesi gerekmez - hashbang'dan sonra doğrudan ssh komutuna atlayabilirsiniz. Yorumunuz bir cevap olsaydı, kabul ediyorum =)
John Hart

JSON kesinlikle birçok durumda XML üzerinde parlıyor, ancak daha önce gelen tüm plistler sorunu zorladı. Birleştirilmiş, verimli, yapılandırılmış veri tabanlı bir değişim yaptığımız için gıdıklandım. cron ve emin bize iyi yaş için hizmet!
bmike

Yüksek ve düşük ek web kaynakları için arama yapıyorum ama her zaman bu yazıya geri dönüyorum. Elbette birisinin tartışmaya daha fazla katkısı var mı? Kabuk betiğimi çalıştırmak için basit bir plist kullanmaya çalıştım ama sonra mailx bildirimlerimi göndermiyor. Hala cron'u seviyorum ve onu her zaman Ubuntu'da kullanıyorum. 10.6'ya geri dönmek istemiyorum ama bu konu beni öldürüyor. Launchctl kullanmaya zorlanmaktan ve temelde kabuk betiklerini otomatikleştirmek için bana çok geniş bir çerçeve gibi hissettirmek zorunda kalmayı sevmiyorum. Kimsenin yeni bir fikri var mı?

Yanıtlar:


10

Bu sayfadaki herkes için, cevabı yayınlamam gerektiğini fark ettim:

Gerçekten cron yerine launchd kullanmak yetkilendirme sorununu çözer. Kullanıcı başlatma işleriniz (yalnızca oturum açtığınızda çalışır) oturum açma işleminin bir parçası olarak anahtarlığınızla açılan SSH aracı bilgilerini doğru şekilde kullanır (standart OS X anahtar yönetiminin bir parçası olarak, başka bir yazılıma gerek yoktur).

Launchd ile etkileşimlerimi en aza indirmek için bash betiği çağıran tek bir launchd işi oluşturdum. Bu şekilde script'i launchd ile uğraşmadan düzenleyebilirim.

İşte launchd dosyası:

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

Dosyayı kaydettim ~/Library/LaunchAgents/com.mycron.hourly.plistve yükledim:

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

Yüklendikten sonra hemen ve sonra her 60 dakikada bir çalışır.

Aynı yordamı izlerseniz, `ProgramArguments 'dizesini komut dosyanızın doğru yoluyla değiştirmek istersiniz.


2
Gerçekten de, cron en azından Lion'da reddedilir. Cevabı bulmak için şeref - başlangıçta zorlanmaya başlayabilir.
zwerdlds

7

Bash shell betiğinize aşağıdaki kodu eklemek sorunu çözecektir:

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

your_userKendi kullanıcı adınızla değiştirin .

Bu kod, SSH_AUTH_SOCKbu bilgi için doğru değeri sshveya kabuk komut dosyası başlatıldığında scpnasıl iletişim kurulacağını belirler .ssh-agentcron


Bu, normal komut satırı (iTerm veya Terminal) aracılığıyla iyi çalışmasına rağmen scp bir kabuk komut dosyasında launchd aracılığıyla çalışmadığı yerde yaşadığım sorunu çözdü. Mükemmel ipucu.
TJ Luoma

Sadece kayıt için, El Captain 10.11.2'de:zsh: no matches found: /tmp/launch-*/Listeners
Ivan Balashov

1

Korumalı alan gibi gelişmiş güvenlik beklerdim ve 64 bit'e bir şeyleri taşımak için yapılan değişiklikler beklenmedik kederlere neden oluyor.

Kendi başına bir cevap değil, ama fırlatma bugünlerde tüm sevgiyi elmadan alıyor.

Cron sorununu düzeltmiyor, ancak daha kararlı ve daha fazla insan bu konuda yardımcı olabilir.


Çok güzel bir cevap var . Gönderdiğiniz için teşekkürler.
bmike

1

Bunu şimdi bulan, El Capitan'da bu işi yapmaya çalışan ve hala tek satırlık cron işinizi bir fırlatma senaryosuna dönüştürmek istemeyen herkes için Werner Antweiler'in cevabı hala çalışıyor, ancak yol değişti. Aşağıdakiler benim için çalıştı:

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

NOT : kullanıcı_adınızı kullanıcı adınızla değiştirmeyi unutmayın!

Ben itibar eksikliği gibi bu onun cevabına bir yorum olarak göndermek izin vermedi ama kesinlikle nihayet kurmak bana yardımcı olduğu gibi bu güncelleme olmadan onu terk etmek istemiyordu.

Düzenleme: 30 Mart 2016

Bunu bir süre test ettikten sonra, bunun yalnızca ajan giriş sırasında en az bir kez kullanıldığında çalıştığını eklemeliyim. Bir ssh bağlantısı başlatmak veya ssh-agent'ı manuel olarak çalıştırmak bunu yapmak için yeterlidir. Otomatik olarak çalışmasını istiyorsanız bir başlangıç ​​komut dosyası da kullanılabilir. Ben sadece ssh-agent çalıştıran bir startup.sh oluşturdum ve sonra aşağıdaki ile bir .app kaydetmek için Script Editor kullandım ve elde edilen uygulamayı giriş öğelerime ekledi:

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

Bunu şu anda çözüyorum ve bu en iyi yol değil. launchd görünüşe göre gitmek için bir yoldur, ancak cron için ssh anahtarınızı (parola ile) anahtarlığınıza kurmak istiyorsunuz. Bunu yaptıktan sonra, Mac'e giriş yapmak her şeyi ayarlar. Ssh-agent'ı manuel olarak çalıştırırsanız (ve parolanızı manuel olarak yazarsanız), yayınladığınız soket yolu tutuldukları yerdir. El Cap'da, anahtarlık yüklendikten sonra soketi aracılığıyla bulun ls /private/tmp/com.apple.launchd.*/Listeners. Mac'e giriş yapmak dışında hiçbir şey yapmanız gerekmez.
joe

launchd kesinlikle bunu yapmanın "resmi" yoludur, ancak cron kullanmaya devam etmek isteyenler için, bu geçerli bir çözüm görevi görür. Testlerimde, sadece oturum açmak, anahtarlık kaydedilmiş bir anahtarın cron üzerinden çalışmasına neden olmak için yeterli değildi. Listelediğiniz yol kesinlikle var. Oturum açar açmaz üretilir ve hala cron için çalışırsa, listelediğim başlangıç ​​komut dosyası yöntemini atlayabilmeniz yeterlidir. Kesinlikle en azından test etmeye değer - teşekkürler!
Petie

Bunu bir yedekleme işlemi için yerine koydum ve bir haftadan uzun bir süredir temiz - yeniden başlatmalar arasında - çalışıyor.
joe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.