Cshtab üzerinden ssh aracısıyla ssh üzerinden rsync komutunu çalıştırın


18

bir cronjob var:

0 9 * * * rsync -a mydir remote_machine:

Bunu 'crontab -e' ile yükledim. i çalışan bir ssh-ajan var ve ben rsync komut yürütmek herhangi bir kullanıcı etkileşimi veya parola giriş w / o çalışır, ancak cronjob aşağıdaki iletiyle başarısız:

Date: Wed,  9 Dec 2009 11:11:00 -0600 (CST)
From: Cron Daemon <me@my_machine.my_domain>
To: me@my_machine.my_domain
Subject: Cron <me@my_machine> rsync -a /home/me/mydir remote_machine:

Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-with-mic,password).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /SourceCache/rsync/rsync-35.2/rsync/io.c(452)
[sender=2.6.9]

bu neden çalışmıyor? cronjobs w / beni kullanıcı olarak çalıştırmak biliyorum (i '* * * * * dokunmatik / tmp / a' i kendi dosya) çalıştırın, bu yüzden rsync benim özel anahtarımı kullanarak giriş gibi varsayalım ...

Yanıtlar:


10

Cron oturum kabuğunuzun ssh aracısı hakkında bilgisi yoktur, bu yüzden onunla konuşamazsınız.

Aracı başlatıldığında, aracı için gereken bilgileri cron oturumunun alması için bir yere koyabilirsiniz.

Misal:

AGENT="ssh-agent -s"
if [ ! -d $HOME/.ssh/agent ]; then
        mkdir -p $HOME/.ssh/agent
fi
#
# Start an agent if there isn't one running already.
#
pid=`ps -u$LOGNAME | grep ssh-age | awk '{print $1}'`
if [ -z "$pid" ]; then
        $AGENT | grep -v echo > $HOME/.ssh/agent/$HOST & pid=$!
        sleep 1 # Let it fork and stuff
fi

Ardından anahtarınızı aracıya ekleyin.

ssh-add $HOME/.ssh/id_dsa

Şimdi cron işiniz ssh kullanmaya başlamadan önce bunu yapmalıdır:

#
# Get our parent to pick up the required SSH env vars.
#
. $HOME/.ssh/agent/$HOST

... bundan sonra, ssh oturumu normal şekilde devam etmelidir.


bu yüzden rsync komutunu izleyen bir komut dosyasına tüm aracıları koyabilir miyim, yoksa cronjob için bir kabuk başlattığında cron otomatik olarak yüklenen bazı .profile veya .bashrc dosyalarına koyabilir miyim?
aaron

Ajan şeyler rsync komutunu çalıştıran komut dosyasında koymak istiyorum.
David Mackintosh

3
tüm ihtiyacım SSH_AUTH_SOCK ve SSH_AGENT_PID env değişkenleri (i .ssh / agent / yerine .ssh-agent koymak) kaynak oldu bu yüzden ne ile sonuçlandı: "0 9 * * *. $ HOME / .ssh -agent && rsync -av $ HOME / mydir remote_machine: "
aaron

1
Tüm bu gereksiz, anahtarlık kullanın
cmcginty

@cmcginty Anahtarlık olduğunu veya takılabileceğini kim söylüyor?
zb226

19

Anahtarlık ihtiyacınız olan şey! Sadece kurun ve takip kodunuzu .bash_profile(veya eşdeğeri) içine ekleyin :

if [ -x /usr/bin/keychain ]; then
  /usr/bin/keychain --quiet --clear $HOME/.ssh/id_rsa
fi

Balık yapılandırması için ( 2 ):

if not status --is-interactive
   keychain --eval --quiet --quick $HOME/.ssh/id_rsa
end

Sonra ssh-agent ortam değişkenlerini yüklemek için betiğinizde aşağıdaki kodu kullanın:

. ~/.keychain/`/bin/hostname`-sh

Balıklar için:

source $HOME/.keychain/(hostname)-fish

Anahtarınızın bir parolası varsa, anahtarlık size bir kez soracaktır (makineyi yeniden başlatana veya ssh aracısını öldürene kadar geçerlidir).

Not: Anahtarlık ayrıca kod cshve fishkabuk oluşturur , bu nedenle "-sh" sonekini "-csh" veya "-fish" olarak değiştirin.


1
$ HOSTNAME cron ortamında tanımlanmadı, ancak bunun dışında bu en iyi çözüm
cmcginty

rsa anahtarlarını kullanırsam, ~ / .ssh / id_dsa anahtarlığını ~ / .ssh / id_rsa anahtarlığına değiştirir miyim?
Katafalkas

@Katafalkas kesinlikle!
semente

@Casey Cevabımı güncelledim. Artık cron ile uyumlu.
semente

Fish için daha iyi talimatlar ekledim.
Elijah Lynn

2

İlk cevabı oylayacak yeterli temsilcim yok, ama yaşadığım sorunu çözdü. Ssh-agent açısından, zaten çalışan bir tane olabilir. SSH_AGENT_PID ve SSH_AUTH_SOCK ortamını ssh-agent'ın başlatılmasında kaydedilecek ek bir şey olmadan çıkarmak için bir komut dosyası. (Perl'e sahip olduğunuzu varsayar)

Aşağıdakileri bir betiğe koyun. (örneğin findagent.pl)

ve cron betiğinizin içine şu satırı ekleyin:

eval `{komut dosyasının yolu} / findagent.pl`


\#!/usr/bin/perl -w
use strict;
my $agents = `ls -tr /tmp/ssh-*/*`;
my @agents;
(@agents) = split/\n/,$agents;

my $sshpid = `ps aux|grep ssh-agent|grep -v grep|awk '{print \$2}'|head -1`;
chomp($sshpid);
my @parts;
for (@agents) {
  chomp($_);
  if (!$_) { next; }
  my $agentfile = $_;
  (@parts) = split/\./,$agentfile;
  my $masterpid = `ps aux|grep $parts[1]|grep enlightenment`;
  if ($agentfile =~ m/$parts[1]/) {
    my $line1 = "SSH_AUTH_SOCK=" . $agentfile . '; export SSH_AUTH_SOCK';
    my $line2 = 'SSH_AGENT_PID=' . $sshpid . '; export SSH_AGENT_PID;';
    my $line3 = 'echo Agent pid ' . $sshpid . ';';
    print("$line1\n$line2\n$line3\n");
    last;
  } else {
    next;
  }
}

1

Uzak makinede kimlik doğrulaması yapmak için anahtar tabanlı kimlik doğrulaması kullandığınızı varsayalım. Aşağıdaki satırı deneyin:

rsync -av --delete -e "ssh -i .ssh/id_rsa" mydir user@host.tld:~/backupDir

Burada .ssh / id_rsa özel anahtarınızın yoludur. Yedeklerimi yapmak için kullandığım doğru satır bu ve benim için her zaman iyi çalışıyor.

En iyi dileklerimle,
Fabian


0

Alternatif olarak, ssh aracısını kullanmak yerine betiğimi RSYNC_RSH = "ssh -i /home/user/.ssh/id_rsa" unset SSH_AGENT_PID SSH_AUTH_SOCK unset SSH_AUTH_SOCK unset rsync çağırmadan önce yaptı. '-E ...' kullanmak yerine RSYNC_RSH içine koymak, kullanılan kimliğin ana bilgisayara göre ayarlanmasını kolaylaştırdı.

Umarım bu yardımcı olur, B


Anahtarınızda bir parolanız varsa bunun işe
yarayacağını sanmıyorum
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.