Як використовувати підстановку (*) при копіюванні з scp?


144

Чому я не можу скопіювати за допомогою scp, коли я використовую *символи на шляху?

scp SERVERNAME:/DIR/* .

Яка конфігурація потрібна SCP, щоб дозволити *шлях?

ОНОВЛЕННЯ: проблема не в стороні сервера; pscp намагається використовувати SCPv1, і саме тому повідомлення про помилку:

командний рядок scp та повідомлення про помилку щодо файлу, який називається *


Перевірте це, для мене це спрацювало: https://superuser.com/a/1390405/445746
AmitM

Відповіді:


126

Вам потрібно пройти буквальну втечу, щоб scpуникнути віддаленої машини, що трактується *як глобус (зауважте, що це вдвічі цитується):

scp 'SERVERNAME:/DIR/\*' .

41
Вам або потрібні котирування, або зворотний нахил перед зіркою, не обидва. І scp - це не той, хто її розширює, оболонка - це.
Патрік

3
Ви пробували? Я щойно зробив, працює саме так, як я описав (цитування та втеча викликає збій). Користувач1274964 навіть підтверджує поведінку у своїй відповіді. 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*' .

judgement_for_job_171642.csv 100% 32KB 32.0KB / s 00:00
judgement_for_job_172394.csv 100% 548KB 182.6KB / s 00:03


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, приклад з використанням подвійних лапок, де змінні в шляху, який ви глобалізуєте, потрібно дозволити розширювати. HTH

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.