При использовании SSH для подключения rsync к удаленному серверу, как вы избегаете пробелов и тому подобного в удаленном пути? Простая обратная косая черта экранирует пространство для локальной подсказки bash, но на удаленном компьютере пространство затем читается как разрыв пути, таким образом отмечая конец этого пути.
Поэтому, когда я делаю, rsync -avz /path/to/source/some\ dir/ user@host.tld:/path/to/dest/some\ dir/
происходит то, что удаленный сервер читает это как просто, /path/to/dest/some/
и так как он не может найти это назначение удаленно, потому что фактическим назначением является «некоторый каталог», а не просто «какой-то».
Если я попытаюсь выполнить ту же команду и избежать обратной косой черты и пробела, чтобы пройти через приглашение локального bash и сохранить обратную косую черту для удаленного сервера (всего три обратной косой черты:) /path/to/dest/some\\\ dir/
, она действительно отправит обратную косую черту на удаленный сервер, но на удаленный сервер. затем интерпретирует путь, /path/to/dest/some\/
а не /path/to/dest/some\ dir/
удаляет пробел и символы после него.
Если я пытаюсь заключить путь в кавычки, он ведет себя примерно так же, эффективно обрезая путь в пространстве. Так что это тоже работает только для того, чтобы пройти через приглашение локальной Баш.
Первоначально я использовал путь, в котором был сегмент «-» (пробел-дефис-пространство), а удаленный сервер возвращал ошибку, rsync: on remote machine: -: unknown option
которая и начала все это стремление избежать пробела.
Итак, что я должен сделать, чтобы это работало правильно с удаленным сервером, без необходимости удалять пробелы или другие ошибочные символы, такие как дефисы, из удаленного пути?
-s
рассматривается вопрос без необходимости применять двойной побег вручную.Ответы:
На компьютере инициатора
rsync
создает командную строку, которая вызывает цель rsync на удаленном компьютере, а затем отправляет эту командную строку, используя ssh .... в качестве одной строки . Эта единственная строка передается в оболочку для анализа, разделения на аргументы и выполненияrsync
. Я понятия не имею, почему это сделано, вместо того, чтобы упаковать (уже разделенные, расширенные и не заключенные в кавычки) аргументы в некотором бинарно-безопасном контейнере в удаленный rsync.Это означает, что ваши аргументы будут проанализированы двумя различными оболочками, кавычки и реквот соответственно. Обычно я заключаю каждый аргумент в двойные кавычки, а затем целое выражение в одинарные кавычки. иногда этого недостаточно, или это может быть сложно, если вы хотите, чтобы одно и то же выражение использовалось локально и удаленно.
В этом случае я обычно устанавливаю некоторые мягкие ссылки с простыми, без пробелов, полностью ASCII-именами, и использую это.
источник
'user@host.tld:"/path/to/dest/some\ dir/"'
eval
или, возможно, через вызов функции?Вы были на правильном пути, когда сказали:
Вот способ, которым я нахожу самый простой способ сделать это:
и этот способ работает также.
Можете ли вы опубликовать точный вывод и какие ошибки вы видите?
Можете ли вы заменить
rsync
с обеих сторон скрипт-обертку?Затем снова запустите rsync, и он должен доказать, что этот способ выхода работает, например,
Сторона клиента:
Сторона сервера:
В приведенном выше примере тот факт, что 4-й аргумент server (
dir with spaces
) находится в одной строке, говорит о том, что цитирование работает правильно.Если это не помогло, попробуйте еще раз
rsync -v
, илиrsync -vv
, илиrsync -vvv
. Это даст вам дополнительную информацию отладки.Два других глупых предложения:
-a
или-r
?источник
Точечный ответ:
Используйте -s (protect args) и заключите ваш путь в кавычки:
rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"
Работает как с пробелами, так и с тире.
источник
Вы можете просто заключить свой путь в кавычки.
источник