Параллельный rsyn c с удаленного сервера получает неожиданный удаленный аргумент - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь вытащить файлы с удаленного сервера на локальный компьютер, используя параллель Чтобы проверить это, я создал на своем удаленном сервере каталог с двумя файлами dummy/bla.txt, dummy/bli.txt Следующая команда работает

sshpass -p "mypass" rsync -ave "ssh -p 12345" omryg@localhost:/cs/sci/omryg/dummy ./

receiving incremental file list
dummy/
dummy/bla.txt
dummy/bli.txt

sent 66 bytes  received 195 bytes  104.40 bytes/sec
total size is 0  speedup is 0.00

Когда я пытаюсь запустить с parallel, я сначала создал файл transfer.log с две строки с именами файлов. Тогда я побежал

sshpass -p "mypass" cat transfer.log | parallel --will-cite -j 2 rsync -ave "ssh -p 12345" omryg@localhost:/cs/sci/omryg/dummy/{} ./

Unexpected remote arg: omryg@localhost:/cs/sci/omryg/dummy/bla.txt
rsync error: syntax or usage error (code 1) at main.c(1354) [sender=3.1.3]
Unexpected remote arg: omryg@localhost:/cs/sci/omryg/dummy/bli.txt
rsync error: syntax or usage error (code 1) at main.c(1354) [sender=3.1.3]

1 Ответ

1 голос
/ 06 апреля 2020

Здесь нужно обсудить несколько вещей.

Во-первых, ошибка командной строки, затем подробности этой строки.

Гипотезы относительно источника ошибки

Таким образом, аргумент omryg@localhost:/cs/sci/omryg/dummy/bla.txt не выглядит неверным.

Возможно ли, что в вашем файле есть недопустимые непечатаемые символы transfer.log? Я думаю более конкретно о неправильных маркерах для новой строки. Иногда это происходит при редактировании файлов в Windows (например, vim будет показывать символ ^M в конце каждой строки; это называется кодировкой "dos"). Однако тот факт, что обе строки обрабатываются последовательно, намекает на правильно обнаруженные символы новой строки…

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

sshpass -p "mypass" cat transfer.log > local.log

и проверить local.log? vim показывает непечатаемые символы, но более тщательный поиск может включать hexdump.

hexdump -c local.log

будет отображать символы, по 16 на строку. Символ новой строки представлен \n. Обратите внимание, что при использовании ванили, hexdump "сбрасывает шестнадцатеричный код", т.е. выводит шестнадцатеричные коды для символов. Опция -c показывает представления указанных символов.

Если все в порядке, вы можете попробовать еще:

cat local.log | parallel …

Я не могу прокомментировать ниже вашего вопроса, потому что мой аккаунт свободен sh новый. Я буду ждать ваших ответов и при необходимости адаптирую свой ответ.

Комментарии к некоторым деталям команды

  1. Проблемы безопасности

В ваших командных строках , вы явно вводите свой пароль; попробуйте создать обмен ключами с сервером: сгенерируйте пару ключей на локальном компьютере с помощью ssh-keygen, скопируйте содержимое ключа publi c (по умолчанию ~/.ssh/id_rsa.pub) в удаленный файл ~/.ssh/known_hosts (создайте его, если он отсутствует, оператор перенаправления bash >> делает это, то есть добавляет файл и создает его, если он отсутствует). Подробнее об этом здесь . Как общий комментарий, ваш пароль должен храниться только в вашем мозгу, но не в скрипте и не в истории команд вашей оболочки. Я не рекомендую использовать sshpass вообще.

Использование parallel и rsync

Теперь об использовании parallel. Это часто считается альтернативой явным циклам (while и for) путем параллельного выполнения итераций. В вашем случае вы запускаете rsync, команду сетевой передачи, параллельно. Во-первых, rsync оптимизирован для последовательных передач и анализа целых каталогов. Во-вторых, независимо от того, сколько процессоров вы используете, вы, скорее всего, будете ограничены общей пропускной способностью сети. Использование parallel также может иметь недостаток: все выходы ваших распараллеленных команд смешиваются и упорядочиваются по мере их запуска . Может быть трудно диагностировать ошибки с большим количеством элементов для обработки. Если вы действительно хотите ограничить список файлов, передаваемых с помощью rsync, вы можете обратиться к опции --include-from=list.txt, где list.txt - это файл шаблонов ASCII (поэтому работают простые имена файлов), по одному на строку. Если вы уверены, что не хотите использовать шаблоны, существует более простой вариант --files-from=list.txt. В этом случае вам нужно только передать каталог в качестве аргумента источника; rsyn c возьмет файлы из него. Подробнее об этом параметре на странице руководства, и соответствующая выдержка была процитирована в extenso там . Наконец, если вам нужно обработать 2 аргумента для запуска на 2 процессорах, вы можете пропустить часть -j 2; это автоматически устанавливается в вашем случае.

Настройка хоста S SH

Я заметил, что вы используете localhost и номер порта -p 12345, который, кажется, указывает на локальный туннель. В случае, если вам нужно вводить это часто, вы можете завершить локальную конфигурацию S SH (~/.ssh/config) с помощью "ярлыка":

host my-proxy
    HostName localhost
    Port 12345
    User omryg

, и теперь ваша командная строка просто читает rsync -ave 'ssh' my-proxy:/cs/sci/omryg/dummy ./. Обратите внимание на отсутствие -p 12345 и omryg@localhost.

...