2013-07-26 2 views
3

Мне нужно сделать скрипт crontab (выполняемый автоматически и периодически), который должен найти последний измененный файл в папке, а затем перенести его на другую машину, используя соединение sftp. Первая часть задачи решается путем извлечения имени нужного файла:Linux: автоматизированный перенос файла sftp по ssh-соединению

cd $myFolder 
output=$(find . -type f -printf "%[email protected] %p\n" | sort -rn | head -n 1) 
filename=$(echo $output | cut -d'/' -f 2) 

Но второй части трудно, потому что я не могу найти способ ввести значение $filename переменной в связи SFTP Linux а также пользователь/пароль неинтерактивным способом. Сохранение его во временный файл может быть хорошим решением.

Есть ли лучшая альтернатива?

Благодаря

ответ

0

Мое решение :

Чтобы получить имя файла:

filename=$(ls -t . | head -1) 

Для того, чтобы передавать данные на удаленный сервер:

#!/usr/bin/expect -f 

# A copy of the $sourceFile is sent to the $targetPath by using the scp command (secure copy) 

set timeout 20 

set sourceFile [lindex $argv 0] 
set targetPath [lindex $argv 1] 
set user [lindex $argv 2] 
set password [lindex $argv 3] 

# connect via scp 
spawn scp $sourceFile "[email protected]$targetPath" 
####################### 
expect { 
    -re ".*es.*o.*" { 
    exp_send "yes\r" 
    exp_continue 
    } 
    -re ".*sword.*" { 
    exp_send "$password\r" 
    } 
} 
interact 

Аутентификация пользователя делегировано скрипт, который использует этот сценарий, и может быть сделано путем генерации открытого/секретного пара ключей на удаленном сервере, а затем используя его: Прочитайте следующую ссылку: SSH login without password.

+0

[Не разбирайте ls.] (Http://mywiki.wooledge.org/ParsingLs) – Marco

2

Вы можете использовать scp вместо sftp - он использует тот же протокол, но больше подходит для неинтерактивного использования.

Вы можете найти последний измененный файл в каталоге только с ls, если каталог содержит только файлы (без подкаталогов):

output=$(ls -t "$myFolder" | head -1) 
3

Вы можете использовать inotify контролировать каталог и триггер изменить. Имя файла можно подать до rsync или scp. Пример:

inotifywait  \ 
    --quiet  \ 
    --event modify \ 
    --format '%f' \ 
    --monitor watch_directory | 
    while read FILE; do \ 
    scp watch_directory/$FILE host:/destination; 
    done 
+0

inotify хорош для синхронизации в реальном времени после событий, связанных с файловой системой, а rsync синхронизирует файловую систему при ее выполнении. Команда scp - лучшая для моей цели. Спасибо –

2

Вы можете использовать локон, чтобы загрузить файл на удаленный сервер через SFTP, и передать логин credientials (имя пользователя и пароль) в команде так:

curl -T uploadfilename -u username:password sftp://sitename.com/myfile 
+0

Это хорошая идея, но у меня она отключена: curl: (1) Протокол sftp не поддерживается или отключен в libcurl –

Смежные вопросы