Я хочу переместить все файлы из локального каталога в удаленный каталог.

И я использую этот код для достижения этого

 SOURCE_FILE=/var/www/oneserver/*
 TARGET_DIR=/var/www/anotherServer
 ARCHIEVEFILE=/var/www/archieveServer

/usr/bin/expect<<EOD
spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST
expect "password:"
send "$PASSWORD\r"
expect "sftp>"
send "put $SOURCE_FILE $TARGET_DIR\r"
expect "sftp>"
send "bye\r"
EOD 

Он работает нормально, но иногда останавливается и отправляет только некоторые файлы.

Я также хочу переместить уже отправленный файл в ARCHIEVEFILE с помощью команды mv. Но не понимаю, как его переместить. Я не могу использовать scp потому что удаленному серверу не разрешено использовать базовый порт, и единственный способ - использовать sftp.

Кто-нибудь может помочь, пожалуйста?

[РЕДАКТИРОВАТЬ]

$ARCHIEVEFILE по-прежнему является локальным сервером, просто для резервного копирования / перемещения, чтобы эти файлы больше не отправлялись со следующим cronjob

TARGET_DIR - это удаленный сервер.

3 ответа3

2

В OpenSSH sftp нет команды для перемещения файлов в удаленный каталог.

Что вы можете сделать, это:

  • используйте sftp put для загрузки файлов (как вы уже делаете), а затем
  • используйте команду shell rm для удаления файлов после выполнения sftp (т.е. после EOD):

    rm $SOURCE_FILE
    

    Или используйте !бежать к раковине из sftp сценария, после отправки put

    send "!rm $SOURCE_FILE\r"
    expect "sftp>"        
    

Конечно, это не атомарное решение. Если файл добавлен между put и rm , он будет потерян. Для атомарного решения вы должны перебирать файлы в локальном каталоге, загружать и удалять их один за другим. Также для надежного решения вам необходимо проверить, была ли загрузка успешной.

1

Следующий подход может многое упростить:

  1. Используйте sshfs для монтирования удаленных общих ресурсов в качестве локальных путей.
  2. Работайте с cp и / или mv как если бы все операции были локальными.

Сравните этот мой ответ.

Вы все еще нуждаетесь в некоторой логике, чтобы обнаружить, успешно ли cp к удаленному расположению, только затем mv к локальному архиву; в противном случае повторите попытку или что-то еще. Но теперь вся работа, связанная с SFTP, должна прозрачно обрабатываться sshfs .

Кроме того, использование оболочки и использование кавычек делает ваш код подверженным ошибкам, связанным с пробелами в именах файлов и т.д.

После того, как вы смонтируете удаленный общий ресурс, например, в /mnt/a b/remote , вам будет намного легче справиться с этим.

(Примечание. Рекомендуется использовать имена переменных в нижнем регистре).

  • Монтировать:

    sshfs -p $port $user@$host:"/path/on/the/remote/host/" "/mnt/a b/remote/"
    

    Используйте аутентификацию на основе ключей или прочитайте имя пользователя и пароль в командной строке с помощью sshfs. Читайте о проблемах безопасности.

  • Заглушка кода для копирования файлов:

    # I deliberately use paths with spaces to show how to handle them
    for filename in "/source/location with spaces"/*; do
       cp "$filename" "/mnt/a b/remote/" &&
       mv "$filename" "/archive/location with spaces/"
    done
    

    Это && гарантирует, что mv будет работать только в случае успеха cp .

  • Размонтировать:

    fusermount -u "/mnt/a b/remote/"
    
0

Вы можете заархивировать исходный каталог, который хотите перенести

zip -r -9 /path/to/your/zip_file.zip var/www/oneserver/*   

(-r будет возвращаться в подкаталоги, -9 будет применять максимальное сжатие для более быстрой передачи)

затем скопируйте файл на ваш удаленный сервер

scp /path/to/your/zip_file.zip user@host:/var/www/anotherServer

а затем разархивировать файл на удаленном сервере

ssh user@host 'unzip /var/www/anotherServer/zip_file.zip'

(есть много флагов, которые вы можете использовать с unzip, которые вы можете использовать, чтобы перезаписывать или никогда не перезаписывать существующие файлы на вашем удаленном сервере, проверьте man unzip для них, особенно -n -o и -u)

надеюсь, это поможет вам

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .