Crontab'da kabuk komut dosyası kullanarak uzak makineye ssh yapılamıyor


11

Aşağıda çalıştırmaya çalıştığım, herhangi bir sorun olmadan çalışan komut dosyası

for i in `seq 200 2100`
do
  usr=(`ssh -t -t -o ConnectTimeout=60 machine$1 finger | tail -1 | awk '{print$1}'`) 
  echo $usr
done

Ama bir kez crontab'a eklediğimde, bana kullanıcıyı vermez.

22  12  *  *  *  sh /home/subrahmanyam/Scripts/who.sh

Lütfen düşüncelerinizi verin .....

cron iblis çalışıyor olabilir, bu yüzden bazı ikili eklemeliyiz ...?


1
İzin reddedildi (publickey, gssapi-keyex, mikrofonlu gssapi, şifre). İzin reddedildi (publickey, gssapi-keyex, mikrofonlu gssapi, şifre). İzin reddedildi (publickey, gssapi-keyex, mikrofonlu gssapi, şifre).

Bununla ilgileriniz neler? Ne elde etmeye çalışıyorsun. Sadece sizin niyetiniz ise herhangi bir kötü amaçlı etkinliğe yardımcı olamayacağımızı biliyorsunuz
Timothy Frew

Yanıtlar:


14

Bir cron oturumu içinde ssh bağlantıları yapabilirsiniz. İhtiyacınız olan şey, şifresiz erişime sahip olacak bir ortak anahtar kimlik doğrulaması ayarlamaktır. Bunun çalışması için, PubkeyAuthentication yesher uzak sunucuda olması gerekir sshd_config.

Parolalı veya parola olmadan özel / genel anahtar çifti oluşturabilirsiniz. Bir parola kullanırsanız (önerilen) ssh-agent'ı da başlatmanız gerekir. Parola olmadan, parametreyi -i your_identity_fileyalnızca sshkomut satırına eklemeniz gerekir . varsayılan olarak sshkullanılır $HOME/.ssh/id_rsa.

Örneğinizi parola içeren bir anahtar çifti kullanarak çoğalttım. İşte böyle yaptım.

1) Anahtar çiftini parola ile oluşturdu. Özel anahtarı ~/.ssh/id_rsa_testvarsayılan olarak doğru izinlere sahip olması gereken şekilde kaydetti. Kullanmamak için boş bir parola girebiliriz.

john@coffee:~$ ssh-keygen -N "somephrase" -f .ssh/id_rsa_test
Generating public/private rsa key pair.
Your identification has been saved in .ssh/id_rsa_test.
Your public key has been saved in .ssh/id_rsa_test.pub.
[snip]

2) Ortak anahtarı sunuculara gönderdi, hepsi için de aynısını yaptı. PubkeyAuthenticationEtkinleştirmeleri gerektiğini unutmayın .

john@coffee:~$ ssh-copy-id -i .ssh/id_rsa_test server1
The authenticity of host 'server1 (11.22.33.1)' can't be established.
RSA key fingerprint is 79:e8:0d:f5:a3:33:1c:ae:f5:24:55:86:82:31:b2:76.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server1,11.22.33.1' (RSA) to the list of known hosts.
john@server1's password: 
Now try logging into the machine, with "ssh 'server1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

3) ssh-agent'ı hizmet olarak çalıştırın -s. Çıkış yaparsanız bu öldürmez. Çıktısı, ortamın ssh istemcisinin ona nasıl bağlanacağını bilmesi için geçerli bir kabuk betiğidir. Bunu bir dosyaya kaydediyoruz (sadece ilk satır gerçekten gerekli).

john@coffee:~$ ssh-agent -s | head -n 1 > ssh-agent.cf 
john@coffee:~$ cat ssh-agent.cf 
SSH_AUTH_SOCK=/tmp/ssh-VhyKL22691/agent.22691; export SSH_AUTH_SOCK;

4) Yukarıdaki bilgileri mevcut ortamımıza yükledik, böylece ssh-addözel anahtarımızı eklemek için kullanabiliriz ssh-agent. yukarıdan parola.

john@coffee:~$ source ssh-agent.cf 
john@coffee:~$ ssh-add  .ssh/id_rsa_test
Enter passphrase for .ssh/id_rsa_test: 
Identity added: .ssh/id_rsa_test (.ssh/id_rsa_test)

5) Eklendi doğrulandı.

john@coffee:~$ ssh-add -l
2048 96:58:94:67:da:67:c0:5f:b9:0c:40:9b:52:62:55:6a .ssh/id_rsa_test (RSA)

6) Kullandığım komut dosyası, sizinkinden biraz değiştirilmiş. Ssh komutunu parantez içine almadığımı ve bunun yerine backticks kullanmadığımı fark ettim $(), bu komut değiştirme için daha iyi bir alternatiftir (bu bashuyumludur, hangi kabuğu kullandığınızı belirtmediniz). Seninkiyle aynı ssh komutunu kullandım.

john@coffee:~$ cat foo.sh 
#!/bin/bash

source /home/john/ssh-agent.cf
for server in server1 server2; do
    usr=$(ssh -t -t -o ConnectTimeout=60 $server finger | tail -1 | awk '{print $1}')
    date=$(ssh -o ConnectTimeout=60 $server date)
    echo "$server - $date - $usr" >> /home/john/foo.log
done

7) Benim crontab (not benim o shaslında bash)

john@coffee:~$ crontab -l
# m h  dom mon dow   command
*/1  *  *  *  *  sh /home/john/foo.sh

8) Çıktı

john@coffee:~$ tail -n 4 foo.log
server1 - Wed Mar 23 14:12:03 EET 2011 - john
server2 - Wed Mar 23 14:12:04 EET 2011 - john
server1 - Wed Mar 23 14:13:03 EET 2011 - john
server2 - Wed Mar 23 14:13:04 EET 2011 - john

Parola kullanmayla ilgili tek sorun, en az bir kez manuel olarak girmeniz gerektiğidir. Bu nedenle, yukarıdaki yeniden başlatmadan sonra otomatik olarak çalışmaz.


Harika - teşekkürler. En azından şimdilik yeniden başlattıktan sonra otomatik yeniden başlatma olmadan yaşayabilirim.
Peter Mounce

SSH anahtarlarınızı göstermeden, ancak SSH aracısını kullanarak güvenli sunuculara zamanlanmış SSH bağlantıları ayarlamak için ssh-cron kullanın. unix.stackexchange.com/questions/8903/…
Luchostein

4

Parolayı kim yazıyor? Cron işi ssh-agent'ınıza erişemez, bu nedenle ortak anahtar çalışmaz.

Bir aracıyı sorgulayamadığından, sshaçıkça bir anahtar dosyası sağlamanız gerekir ( -iseçeneğe bakın ); ve bu anahtarın boş bir parolası olmalıdır .


Kullanıcı adı ve parolayı da geçerek denedim - ssh -t -t -o ConnectTimeout = 60 kullanıcı @ makine $ 1 parmak | kuyruk -1 | awk '{print $ 1}' </ home / user / passwd ---- ana dizin NFS'de, yani her makineye bağlanıyor

Ssh'ın bir anlamı varsa, bunun /dev/ttyyerine şifreyi okumak için kullanılır stdin; bu crondan çalışmayacak.
geekosaur

-İ seçeneği vererek denedim ama şans yok! ---- ssh -o ConnectTimeout = 60 -i /home/subrahmanyam/.ssh/known_hosts makinesi 1 $ parmak | kuyruk -1 | awk '{print $ 1}' ------ UYARI: KORUMALI ÖZEL ANAHTAR DOSYA! '/Home/user/.ssh/known_hosts' için 0640 izinleri çok açık. Özel anahtar dosyalarınıza başkaları tarafından erişilemez. Bu özel anahtar yok sayılır. kötü izinler: yoksayma tuşu:

Neden şikayet ediyor known_hosts? Ancak evet, izinlere dikkat etmelisiniz - özel anahtar dosyası size ait 0600 hatta 0400 olmalıdır. Kullanabilmek için başka bir kullanıcıya ihtiyacınız varsa, POSIX ACL'lerini veya benzerini inceleyebilirsiniz.
geekosaur

Düşünmeye gel, GSSAPI'nin orada sunulduğunu gördüm, bu yüzden başka bir olasılık bir keytab almak ve bunu kinitcron işinin içinde kullanmaktır . Bununla birlikte, keytablar izinlerde de aynı bakımı gerektirir; ama sshen azından onlar hakkında şikayet etmeyeceğim.
geekosaur

1

Forcefsck gibi geçici bir dosyayı saklamak yerine find, aktif aracıyı aramak için kullanmayı tercih ederim .

İhtiyacı olan bir komut dosyasının konusunu ssh-agentkullanıyorum:

export SSH_AUTH_SOCK=$(find /run/user/$(id -u)/ -mindepth 2 -maxdepth 2 -path '*keyring-*' -name 'ssh' -print -quit 2>/dev/null)

ssh-agentSoketi arar ve birincisini döndürür. Yalnızca geçerli kullanıcıyla sınırlıdır, bu nedenle yanlışlıkla başka bir kullanıcı kullanmayı denemez ve izin verilmedi hatası alırsınız. Ayrıca zaten bir aktif ile giriş yapmış olmanız gerekir ssh-agent. (Ubuntu, GUI başladığında bir aracı başlatır).

Bunu başka bir komut dosyasına koyarsanız , değişkenle ayarlaması gerektiği için sourceveya ile çağırmanız gerekir ..SSH_AUTH_SOCK


0

SSH anahtarlarınızı göstermeden, ancak SSH aracısını kullanarak güvenli sunuculara zamanlanmış SSH bağlantıları ayarlamak için ssh-cron kullanın .


0

Komut dosyanızı veya komutunuzu crontab'da aşağıdaki gibi çalıştırabilirsiniz:

0 * * * * bash -c -l "/home/user/sshscript.sh"

veya

0 * * * * bash -c -l "ssh root@yourhost 'echo $HOSTNAME'"
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.