Исключить символы для 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?
  • Копирование большого дерева с одной машины на другую, сохранение права собственности
  • Каков наилучший подход к копированию каталогов?
  • Как подключить передачу файла scp / ssh (pull) через tar (удаленный -> локальный перенос, инициированный с локальной машины)
  • Как просмотреть прогресс с помощью sshpass и scp в linux?
  • Как я могу вернуть конкретный код ошибки в этот момент в моем TCL-скрипте?
  • ssh / scp работает, но rsync просто постоянно говорит «нет»,
  • scp с паролем и переименование файла
  • PSCP - почему он не может найти файл при использовании учетных данных, отличных от admin?
  • Я пытаюсь установить мой открытый ключ вручную w / scp
  • Ошибка SSHFS, Ошибка - чтение: Сброс соединения с помощью одноранговой сети
  • Interesting Posts

    Странная проблема с зависанием / рысью и неразрешительными доменами

    Команда realm не работает корректно при использовании в скрипте (CentOS 7)

    найти команду из регулярного выражения

    Перезапуск Gnome 3 в Debian Wheezy?

    mv в подкаталог раздела устройства, например, каталог mv / dev / partition /?

    Линукс VT поддерживает 8 цветов, но в действительности существует 16 районных. Почему так?

    Centos 6.6, изменить размер раздела

    Какая память не используется процессами и освобождается `echo 3> / proc / sys / vm / drop_caches`?

    Как пропустить проверку DNS, пока я отключен от Интернета

    Не удалось получить psk из сети с помощью wpa_cli

    если команда find -exec

    Шестнадцатеричная проверка последовательности чисел в Linux?

    Отображение эскизов или какого-либо предварительного просмотра в всплывающем меню рабочего пространства Gnome?

    Предотвращение событий с несколькими щелчками мыши

    Как запустить несколько «последовательных» процессов под управлением, учитывая доступные процессоры?

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