Исключить символы для SCP-файла

Есть ли способ создать выражение для scp с которым мне удастся скопировать файл

 file-name-version-1.2.1.jar 

без копирования файлов

 file-name-version-1.2.1-sources.jar file-name-version-1.2.1-javadoc.jar 

не зная точных номеров версий? file-name-version-*.*.*.jar не будет работать по понятным причинам. Я ищу синтаксис вроде

 file-name-version-\d.\d.\d.jar 

или что-то подобное.

4 Solutions collect form web for “Исключить символы для SCP-файла”

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

Если вы это сделаете:

  scp user@remote-machine:'something' ... 

На удаленном компьютере sshd будет запускать user оболочку user как:

  that-shell -c 'scp -f something' 

И это оболочка, которая будет расширять шаблоны там.

Это означает, что способ расширения шаблона будет зависеть от того, какую оболочку входа использует удаленный пользователь. Когда эта оболочка является bash , это также будет зависеть от того, что пользователь имеет в ~/.bashrc , или того, что есть в /etc/bash.bashrc (например, /etc/bash.bashrc bash-completion вызываемый оттуда при установке, включает расширенный ksh-стиль globbing), так как по какой-то причине bash читает их при вызове ssh (хотя это не интерактивная оболочка).

Это также означает, что если something есть, например, 'blah; rm -rf "$HOME"' 'blah; rm -rf "$HOME"' , что будет иметь катастрофические последствия.

Это одно из неправильных имен ssh .

Если вы хотите заставить определенную оболочку развернуть что- something в списке файлов, вы можете использовать этот трюк:

 LC_SCPFILES=something scp -o SendEnv=LC_SCPFILES "localhost:</dev/null bash -O extglob -c 'exec scp -f -- \$LC_SCPFILES';exit" /dest/dir 

Это работает только в том случае, если оболочка входа удаленного пользователя является нормальной оболочкой Unix (из Bourne, csh, rc или семейств рыб, по крайней мере), и там устанавливается bash а sshd позволяет передавать переменные среды, имя которых начинается с LC_ .

Фокус в том, что большинство развертываний sshd позволяют передавать переменные среды, чье имя начинается с LC_ (необходимо, чтобы испанский пользователь мог получать сообщения об ошибках из удаленных команд на испанском языке (вместо языка по умолчанию на удаленной системе или на языке удаленного пользователя ) например).

Итак, мы передаем something в переменной окружения LC_SCPFILES .

На удаленном компьютере sshd будет запущен:

 that-shell -c 'scp -f </dev/null bash -O extglob -c '\''exec scp -f -- $LC_SCPFILES'\'';exit' 

Поскольку его stdin перенаправляется из /dev/null , первый scp выйдет сразу. Затем мы начинаем нашу оболочку выбора ( bash ) с опцией extglob и с командной строкой exec scp -f -- $LC_SCPFILES для интерпретации.

Поскольку bash будет выполняться в дочернем процессе that-shell (который мы обеспечиваем добавлением ;exit затем ;exit ), bash не будет ~/.bashrc , поэтому мы можем ожидать, что поведение bash там по умолчанию (если только that-shell не так , при запуске задает переменные среды BASHOPTS , SHELLOPTS или BASH_ENV ).

Поскольку $LC_SCPFILES не цитируется, он будет подвергаться расщеплению слов и генерации имени файла (globbing), но не другим расширениям оболочек, и он не будет делать что-то rm -rf "$HOME" только потому, something что- something содержит его.

Теперь, когда мы убедились, что шаблон расширен на bash -O extglob на удаленной машине, мы можем использовать его для соответствия шаблону, который использует расширенные операторы glob (здесь используется вспомогательная функция):

 safer_scp() ( file=$1; shift export LC_SCPFILES="${file#*:}" exec scp -o SendEnv=LC_SCPFILES "${file%%:*}:</dev/null bash -O extglob -c 'exec scp -f -- \$LC_SCPFILES';exit" "$@" ) safer_scp user@host:'file-name-version-+([0-9]).+([0-9]).+([0-9]).jar' . 

Параметр +([0-9]) с extglob в bash соответствует одной или нескольким десятичным разрядам. Таким образом, вышеприведенный шаблон будет соответствовать file-name-version-1.2.3.jar и file-name-version-12.123.1234.jar например.

(обратите внимание, что safer_scp above предполагает, что первым аргументом является host:file-patterns , такие как safer_scp -r ... или safer_scp host1:f1 host2:f2 ... не будут работать. Если вы хотите использовать -r , проще всего определить функцию safer_scp_r где scp -f выше заменен на scp -r -f ).

Обратите внимание, что вы можете отключить разбиение слов, добавив IFS=; перед exec scp... выше.

Также обратите внимание, что мы используем bash здесь, основываясь на том, что он установлен во всех системах GNU, но если вы знаете, что zsh установлена ​​на удаленной системе, вы можете использовать

 zsh -o extendedglob -o globsust 

вместо этого воспользоваться полной мощью zsh globbing (рекурсивными, квалификаторами …)

(добавьте -o shwordsplit если вы хотите разделить слово).

Например:

 safer_scp() ( file=$1; shift export LC_SCPFILES="${file#*:}" exec scp -o SendEnv=LC_SCPFILES "${file%%:*}:</dev/null zsh -o extendedglob -o globsubst -c 'exec scp -f -- \$LC_SCPFILES';exit" "$@" ) safer_scp user@host:'file-name-version-<->(.<->)#.jar' . 

file-name-version-1.jar бы file-name-version-1.jar и file-name-version-1.2.3.4.5.jar ( <xy> – любое десятичное целое число от x до y , <-> – любое десятичное целое число, # is как оператор * regexp (0 или более предыдущего атома))

Я думаю, ты хочешь

 file-name-version-[0-9].[0-9].[0-9].jar 

В этом конкретном случае

 scp 'user@host:file-name-version-*[0-9].jar' . 

может быть достаточно для вас.

Для гибкости используйте rsync вместо scp.

 rsync --include='file-name-*.jar' \ --exclude='*-sources.jar' --exclude='*-javadoc.jar' \ example.com:/some/directory/ local/directory/ 
  • scp при попытке скопировать файлы из Linux в windows
  • scp to / home изменяет разрешения?
  • Потеря качества файла .eps после использования scp для передачи с удаленного сервера
  • Рекурсивный scp без следующих ссылок или создания гигантского файла tar?
  • ssh / scp работает, но rsync просто постоянно говорит «нет»,
  • sftp для получения / загрузки файла .tar.gz
  • Копирование файлов между двумя хостами
  • загружать и загружать файлы с сервера без указания пароля
  • Скопировать символические ссылки из файла ext3 в cifs
  • scp-файлы из нескольких каталогов из локальных в несколько каталогов на удаленном компьютере по одной команде
  • sshpass с SSH работает, но sshpass с SCP не
  • Interesting Posts

    Модуль scsi_wait_scan не найден в CentOS kernel-ml вызывает панику ядра при загрузке

    Установщик Antergos говорит, что у меня нет / загрузочного раздела

    Запустить сценарий оболочки без отображения всех журналов

    «Нарушение совместного использования смарт-карт» при использовании OpenSC и GnuPG

    Виртуальная консоль приостанавливает воспроизведение видео и аудио в KDE

    Запуск моего локального сценария bash на удаленном сервере

    32 или 64-битный файл класса

    Есть ли альтернатива использованию rbash для ограничения пользователя в моей системе?

    Какой поток использует перцепция?

    Почему альса звучит поп, треск и вообще слишком искажен, чтобы слушать?

    Почему / как «время безотказной работы» показывает загрузку CPU> 1?

    как установить стиль тильды + псевдоним?

    Как проверить, не может ли бинарный доступ к Интернету без его запуска?

    Как установить Empathy на CentOS 6.0?

    Что происходит с вспомогательными данными unix stream при частичном чтении

    Linux и Unix - лучшая ОС в мире.