Jalankan perintah rsync melalui ssh dengan agen ssh via crontab


18

saya punya cronjob:

0 9 * * * rsync -a mydir remote_machine:

saya menginstal ini dengan 'crontab -e'. saya memiliki ssh-agent yang berjalan, dan ketika saya menjalankan perintah rsync itu sendiri ia berfungsi tanpa interaksi pengguna atau kata sandi, tetapi cronjob gagal dengan pesan berikut:

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]

mengapa ini tidak berhasil? saya tahu cronjobs dijalankan dengan saya sebagai pengguna (jika saya jalankan '* * * * * sentuh / tmp / a' saya memiliki file) jadi saya menganggap rsync sedang masuk saat saya menggunakan kunci pribadi saya ...

Jawaban:


10

Shell sesi cron Anda tidak memiliki pengetahuan tentang agen ssh, jadi tidak dapat berbicara dengannya.

Ketika agen dimulai, Anda dapat menempatkan informasi yang diperlukan untuk agen di suatu tempat untuk diambil sesi cron.

Contoh:

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

Kemudian tambahkan kunci Anda ke agen.

ssh-add $HOME/.ssh/id_dsa

Sekarang tugas cron Anda harus melakukan ini sebelum mencoba menggunakan ssh:

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

... setelah itu, sesi ssh harus dilanjutkan secara normal.


jadi apakah saya meletakkan semua barang agen dalam skrip yang diikuti oleh perintah rsync, atau dapatkah saya meletakkannya di beberapa file .profile atau .bashrc yang di-load cron secara otomatis ketika memulai shell untuk cronjob?
Aaron

Saya akan memasukkan barang-barang agen ke dalam skrip yang menjalankan perintah rsync.
David Mackintosh

3
semua yang saya butuhkan adalah untuk sumber variabel env SSH_AUTH_SOCK dan SSH_AGENT_PID (saya menempatkan mereka di .ssh-agent bukan .ssh / agent /) jadi ini adalah apa yang saya berakhir dengan: "0 9 * * *. $ HOME / .ssh -agent && rsync -av $ HOME / mydir remote_machine: "
aaron

1
Semua ini tidak perlu, gunakan gantungan kunci
cmcginty

@ cmcginty siapa bilang gantungan kunci tersedia, atau dapat diinstal?
zb226

19

gantungan kunci adalah apa yang Anda butuhkan! Cukup instal dan tambahkan kode ikuti di .bash_profile(atau setara) Anda:

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

Untuk config.fish ( 2 ):

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

Kemudian gunakan kode di bawah ini dalam skrip Anda untuk memuat variabel lingkungan ssh-agent:

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

Untuk ikan:

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

Jika kunci Anda memiliki frasa sandi, gantungan kunci akan meminta Anda satu kali (valid hingga Anda me-reboot mesin atau membunuh ssh-agent).

Catatan: gantungan kunci juga menghasilkan kode cshdan fishkerang, jadi ganti saja akhiran "-sh" menjadi "-csh" atau "-fish".


1
$ HOSTNAME tidak didefinisikan dalam lingkungan cron, tetapi selain itu ini adalah solusi terbaik
cmcginty

jika saya menggunakan kunci rsa, apakah saya mengubah gantungan kunci ~ / .ssh / id_dsa menjadi gantungan kunci ~ / .ssh / id_rsa?
Katafalkas

@Katafalkas tepatnya!
semente

@Casey Saya sudah memperbarui jawaban saya. Sekarang kompatibel dengan cron.
semente

Saya menambahkan instruksi yang lebih baik untuk Ikan.
Elijah Lynn

2

Saya tidak memiliki cukup perwakilan untuk memberikan suara pada jawaban pertama, tetapi itu memecahkan masalah yang saya alami. Dalam hal ssh-agent, Anda mungkin sudah menjalankan satu. Berikut ini adalah skrip untuk mengekstrak SSH_AGENT_PID & SSH_AUTH_SOCK dari lingkungan tanpa hal tambahan untuk disimpan pada startup ssh-agent. (Menganggap bahwa Anda memiliki perl)

Masukkan yang berikut ini dalam naskah. (misalnya findagent.pl)

dan di dalam skrip cron Anda tambahkan baris:

eval `{path to script} / 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

Saya kira Anda menggunakan otentikasi berbasis kunci untuk mengotentikasi diri Anda dengan mesin jarak jauh. Coba baris di bawah ini:

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

Di mana .ssh / id_rsa adalah jalur ke kunci pribadi Anda. Ini adalah garis persis yang saya gunakan untuk melakukan backup dan selalu berfungsi dengan baik untuk saya.

Salam hangat,
Fabian


0

Sebagai alternatif, alih-alih menggunakan ssh agent, saya membuat skrip saya untuk mengekspor RSYNC_RSH = "ssh -i /home/user/.ssh/id_rsa" unset SSH_AGENT_PID unset SSH_AUTH_SOCK sebelum memanggil rsync. Dengan meletakkannya di RSYNC_RSH alih-alih menggunakan '-e ...' itu membuatnya mudah untuk menyesuaikan file id yang digunakan berdasarkan host.

Semoga ini bisa membantu, B


Saya tidak berpikir ini berfungsi jika Anda memiliki frasa sandi pada kunci Anda
cmcginty
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.