Как использовать подстановочные знаки (*) при копировании с помощью scp?

144

Почему я не могу копировать с помощью scp, когда я использую *символы в пути?

scp SERVERNAME:/DIR/* .

Какая конфигурация необходима SCP для доступа *на пути?

ОБНОВЛЕНИЕ: проблема не на стороне сервера; pscp пытается использовать SCPv1, и поэтому появляется сообщение об ошибке:

командная строка scp и сообщение об ошибке относительно файла с именем *

LanceBaynes
источник
Проверьте это, у меня это сработало: https://superuser.com/a/1390405/445746
AmitM

Ответы:

126

Вам нужно передать буквальное экранирование, scpчтобы удаленный компьютер не воспринимался *как глоб (заметьте, что он указан в двойных кавычках):

scp 'SERVERNAME:/DIR/\*' .
Крис Даун
источник
41
Вам нужны либо кавычки, либо обратный слеш перед звездой, а не оба. И scp - это не тот, кто его расширяет, а оболочка.
Патрик
3
Ты это пробовал? Я только что сделал, работает точно так, как я описал (цитирование и экранирование вызывает сбой). User1274964 даже подтверждает поведение в своем ответе. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Патрик
2
@Patrick Вопрос в том, чтобы использовать буквальную звездочку, т.е. вообще избегать глобализации, а не в том, как использовать глобализацию на пульте.
Крис Даун
2
На самом деле вопрос заключается в том, чтобы pscpна стороне клиента разрешить удаленную глобализацию.
Патрик
1
Да, вам не нужно избегать звездочки, если вы используете одинарные кавычки
Led
52

Я нашел совет Патрика правильным, хотя ответ Криса поставил меня на правильный путь. Используйте кавычки, и вам не понадобится обратная косая черта перед звездочкой.

scp 'SERVERNAME:/tmp/file_num\*' .

scp: /tmp/file_num*.csv: нет такого файла или каталога

scp 'SERVERNAME:/tmp/file_num*' .

суждений_for_job_171642.csv 100% 32 КБ 32,0 КБ / с 00:00
суждений_for_job_172394.csv 100% 548 КБ 182,6 КБ / с 00:03

user1274964
источник
4
Правильно, потому что это означает, что вы хотите использовать удаленное управление. Вопрос в том, как прекратить глобализацию на пульте (чтобы получить литерал *), а не в том, как сделать глобализацию только на пульте.
Крис Даун
3
@ChrisDown. Нет. Пользователь хочет, чтобы подстановочный знак не был расширен на хосте, и хочет, чтобы он был расширен на удаленном компьютере, чтобы он мог соответствовать нескольким файлам там. Ни в одном из возвращенных файлов нет буквального «*». Возможно , вы имели в виду « остановить подстановка на хосте »?
Тим Берд
1

ПРИМЕЧАНИЕ. Предлагаемое ниже решение протестировано и, как известно, работает правильно.

Одинарные кавычки нарушат раскрытие переменной, если вы наложили псевдоним на часть пути, который вы используете.

Вот скрипт, который использует кавычки DOUBLE для сценария использования глобализированного имени файла command-configure_ .tar.gz *, используя путь с псевдонимом переменной:

#!/bin/bash

USEREXECUTINGSCRIPT='admin'
SCRIPTSDIR="myscripts"

SCPUSER='terrencehoulahan'
SCPUSERPASSWD='Change-Me'
SCPHOST='1.2.3.4'
SCPDIRECTORYREMOTE='/Users/terrencehoulahan/Downloads/Ubuntu/18.04'

## Uncomment appropriate below command for your distro to install "sshpass"
#apt-get -y sshpass
#yum -y install sshpass

sshpass -p "$SCPUSERPASSWD" scp -o StrictHostKeyChecking=no $SCPUSER@$SCPHOST:"$SCPDIRECTORYREMOTE/command-configure_*.tar.gz" $(getent passwd|grep ^$(echo $USEREXECUTINGSCRIPT)|cut -d ':' -f6)/$SCRIPTSDIR/

После закрывающей двойной кавычки цель локального каталога создается путем простого извлечения домашнего каталога указанного пользователя из / etc / passwd .

Сама команда scp предваряется sshpassи -o StrictHostKeyChecking=noполностью автоматизирует scpкоманду без вмешательства пользователя. Выглядит извилистым, но лучше, чем пути жесткого кодирования, которые время от времени будут меняться.

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

F1Linux
источник