Intereting Posts
Linux Debain Squeezy Distro: Weakerth4n, Kconfig && делают проблемы Я хочу статический IP-адрес для моего (сетевого или компьютерного)? Любая утилита для поиска источника загрузки / загрузки системы за определенный период? Как передать результат скручивания в качестве параметра Поддерживает ли Linux ThinkPad Helix 2? Переменные среды. Где они спасены? Не удалять или перемещать в корзину в контекстном меню в некоторых каталогах (gnome) Создание нескольких временных псевдонимов Почему перенаправление в crontab приводит к нулевому байтовому файлу? Как реализовать «генераторы», такие как $ RANDOM? VBoxManage: ошибка: не может использоваться как запрошенное устройство Как установить / проанализировать зависимости сборки от debian / control? отправлять фальшивые письма с помощью почтовых клиентов Linux openssl CN / проверка имени хоста против SSL-сертификата Не требуется root для добавления принтеров

SFTP для загрузки файлов в cronjob

Я хочу использовать SFTP для загрузки файлов с A на B.

путь для пути A: / tmp / A для B: / tmp / B

сервер B имеет собственное имя пользователя и пароль. мой cronjob будет запускаться каждые 10 минут, чтобы проверить, есть ли новые файлы под / tmp / A, если да, то они передадут файл, если нет, никакой передачи.

Вы можете использовать команду rsync для такого рода операций.

Как использовать rsync для синхронизации с удаленной системой

Синхронизация с удаленной системой тривиальна, если у вас есть SSH-доступ к удаленному компьютеру и rsync, установленный с обеих сторон. Вам нужно настроить SSH-ключи, хорошо описано, как это сделать здесь: https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys–2

После подтверждения доступа SSH между двумя машинами вы можете синхронизировать папку dir1 с ранее на удаленном компьютере с помощью этого синтаксиса (обратите внимание, что мы хотим перенести фактический каталог в этом случае, поэтому мы опускаем конечную косую черту):

 rsync -avz ~/dir1 username@remote_host:destination_directory 

Это называется «push», потому что он выталкивает каталог из локальной системы в удаленную систему.

Если я правильно понимаю, я обнаружил, что некоторые SFTP-серверы не поддерживают ssh-ключи, поэтому rsync не будет работать (например, report.paypal.com). В этом случае вам понадобится сценарий, выполняющий sftp-вещь, вы можете использовать для этого ожидание … Вот сценарий, который должен сработать для вас:

 #!/bin/sh bname=`basename $0` usage () #usage instructions { cat <<EOF syncs LOCALPATH to REMOTEPATH on sftp://SERVICE Usage : ./$bname [-s SERVICE -l LOCALPATH -r REMOTEPATH] [-h] -h display this help text. Example: ./$bname -s your.sftpserver.com -l /tmp/A -r /tmp/B will upload any missing files from /tmp/A to /tmp/B EOF exit 0 } upload () { security find-generic-password -s _$SERVICE_sftp >/dev/null 2>/dev/null #test if entry exists in keychain if [ $? -ne 0 ]; then echo "Please enter username for sftp://"$SERVICE read username echo $username > .credentials_tmp read -p "Password:" -s pass echo $pass >> .credentials_tmp else echo `security find-generic-password -s _$SERVICE_sftp | grep "acct" | cut -d \" -f 4` > .credentials_tmp echo `security find-generic-password -s _$SERVICE_sftp -w` >> .credentials_tmp fi echo $SERVICE >> .credentials_tmp echo $REMOTEPATH >> .credentials_tmp echo $LOCALPATH >> .credentials_tmp ls -1 $LOCALPATH > .LocalFileList.txt echo " Connecting to sftp://"$SERVICE expect << 'EOS' log_user 0 set send_human {.1 .3 1 .05 2} spawn sftp [exec sed "1p;d" .credentials_tmp]@[exec sed "3p;d" .credentials_tmp]:[exec sed "4p;d" .credentials_tmp] set timeout 30 expect { "Password:" { # exp_continue } timeout { send_user " *** Connection timed out. Check connection and verify the username/password"; exit 1 } } puts "Authenticating" send "[exec sed "2p;d" .credentials_tmp]\n" #log_user 1 expect { "sftp>" { # exp_continue } timeout { send_user " *** Connection timed out. Check connection"; exit 1 } } puts "Getting Remote File List" log_file -a -noappend .RemoteFileList.txt send "ls -1\n" expect { "sftp>" { # exp_continue } timeout { send_user " *** Connection timed out. Check connection"; exit 1 } } log_file system sed -i '' '/ls -1/d' ./.RemoteFileList.txt system sed -i '' '/sftp>/d' ./.RemoteFileList.txt puts "Comparing with files in [exec sed "5p;d" .credentials_tmp]" sleep 1 set rc [catch {exec diff -aw --changed-group-format=%< --unchanged-group-format= .LocalFileList.txt .RemoteFileList.txt} output] if {$rc == 0} { puts "no difference" } else { if {[lindex $::errorCode 0] eq "CHILDSTATUS"} { if {[lindex $::errorCode 2] == 1} { # send output without "child process exited abnormally" message set filename ".newfiles.txt" set fileId [open $filename "w"] puts -nonewline $fileId [string replace $output end-31 end ""] close $fileId } else { puts "diff error: $output" } } else { puts "error calling diff: $output" } } sleep 1 if {[file size .newfiles.txt] == 0} { sleep 1 send "bye\n" puts " There are no local files missing from the remote server" interact } else { set f [open ".newfiles.txt"] while {[gets $f line] != -1} { send "put [exec sed "5p;d" .credentials_tmp]/$line\n" puts "Uploading $line..." expect { "sftp>" { # exp_continue } timeout { send_user " *** Connection timed out. Check connection"; exit 1 } } } close $f send "bye\r" puts " Finished syncing from [exec sed "5p;d" .credentials_tmp] to sftp://[exec sed "3p;d" .credentials_tmp]:[exec sed "4p;d" .credentials_tmp]" } EOS security find-generic-password -s _$SERVICE_sftp >/dev/null 2>/dev/null #test if entry exists in osx keychain if [ $? -ne 0 ]; then while true; do read -p " Do you want to save these login details for next time? y/n " yn case $yn in [Yy]* ) security add-generic-password -s _$SERVICE_sftp -a `sed '1p;d' .credentials_tmp` -w `sed '2p;d' .credentials_tmp` -U rm -f .credentials_tmp echo "credentials saved." break ;; [Nn]* ) rm -f .credentials_tmp exit 1 ;; * ) echo "Please answer yes or no. y/n ";; esac done fi rm -f .credentials_tmp rm -f .newfiles.txt rm -f .LocalFileList.txt rm -f .RemoteFileList.txt } # From here down is all to do with handling the flags you type into the command line, after the name of the script. if [ ! $# == 6 ] || [ "$1" = "-h" ] || [ "$1" = "-" ] then usage fi while getopts ":s:l:r:" opt; do case $opt in s) SERVICE=$OPTARG;; l) LOCALPATH=$OPTARG;; r) REMOTEPATH=$OPTARG;; \?) echo "Invalid option: -$OPTARG type ./"$bname" -h for help " >&2 exit 1 ;; esac #shift $(( OPTIND - 1 )) done upload $SERVICE $LOCALPATH $REMOTEPATH 

Чтобы использовать, просто сохраните код в файле, например uploadsftp.sh, и запустите chmod u+x uploadsftp.sh

Затем вы можете установить cron в cd в каталог сценария и запустить скрипт: ./uploadsftp.sh -s SERVICE -l LOCALPATH -r REMOTEPATH когда вам это нужно.