Jak używać symboli wieloznacznych (*) podczas kopiowania za pomocą SCP?

144

Dlaczego nie mogę kopiować za pomocą SCP, kiedy używam *znaków na ścieżce?

scp SERVERNAME:/DIR/* .

Jakiej konfiguracji potrzebuje SCP, aby zezwolić *na ścieżkę?

AKTUALIZACJA: problem nie występuje po stronie serwera; pscp próbuje użyć SCPv1 i dlatego komunikat o błędzie:

Polecenie scp i komunikat o błędzie dotyczący pliku o nazwie *

LanceBaynes
źródło
Sprawdź to, zadziałało dla mnie: https://superuser.com/a/1390405/445746
AmitM

Odpowiedzi:

126

Musisz przejść dosłowną ucieczkę, aby scpuniknąć traktowania maszyny zdalnej *jako globu (zauważ, że jest ona podwójnie cytowana):

scp 'SERVERNAME:/DIR/\*' .
Chris Down
źródło
41
Potrzebujesz gwiazdki lub ukośnika odwrotnego przed gwiazdą, a nie obu. I SCP nie jest tym, który ją rozwija, lecz powłoką.
Patrick
3
Próbowałeś tego? Właśnie to zrobiłem, działa dokładnie tak, jak to opisałem (cytowanie i ucieczka powoduje niepowodzenie). Użytkownik1274964 nawet potwierdza zachowanie w swojej odpowiedzi. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Patrick
2
@Patrick Pytanie dotyczy użycia dosłownej gwiazdki, tzn. Całkowitego unikania globowania, a nie sposobu globowania na pilocie.
Chris Down,
2
W rzeczywistości pytanie dotyczy pscpdostępu po stronie klienta, aby umożliwić zdalne globowanie.
Patrick
1
Tak, nie musisz uciekać od gwiazdki, jeśli używasz pojedynczych cudzysłowów
Led
52

Uważam, że rada Patricka jest poprawna, chociaż odpowiedź Chrisa doprowadziła mnie na właściwy tor. Używaj cudzysłowów, a potem nie potrzebujesz odwrotnego ukośnika przed gwiazdką.

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

scp: /tmp/file_num*.csv: Brak takiego pliku lub katalogu

scp 'SERVERNAME:/tmp/file_num*' .

judgments_for_job_171642.csv 100% 32KB 32.0KB / s 00:00
judgments_for_job_172394.csv 100% 548KB 182,6KB / s 00:03

użytkownik1274964
źródło
4
Racja, ponieważ oznacza to, że chcesz globować na pilocie. Pytanie dotyczy tego, jak zatrzymać globowanie na pilocie (aby uzyskać literał *), a nie jak globować tylko na pilocie.
Chris Down,
3
@ChrisDown. Nie. Użytkownik chce, aby symbol wieloznaczny nie był rozwijany na hoście i chce, aby był on rozwijany na pilocie, aby umożliwić dopasowanie wielu plików. Żaden zwrócony plik nie zawiera dosłownie „*”. Miałeś na myśli „ stop globbing na hoście ”?
Tim Bird
1

UWAGA: Rozwiązanie oferowane poniżej przetestowane i działające poprawnie.

Pojedyncze cudzysłowy przerywają rozszerzanie zmiennych, jeśli aliasujesz część ścieżki, którą globujesz.

Oto skrypt, który wykorzystuje DOUBLE cytaty dotyczące użytkowej przypadku globbed filename poleceń configure_ .tar.gz * przy użyciu ścieżki aliasem ze zmienną:

#!/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/

Po zamknięciu podwójnego cudzysłowu konstruuje się katalog docelowy lokalnego katalogu poprzez wyodrębnienie katalogu domowego określonego użytkownika z / etc / passwd .

Sama komenda scp jest poprzedzona sshpassi -o StrictHostKeyChecking=nopełni zautomatyzować scpkomendę bez interakcji użytkownika. Wygląda na zawiłe, ale lepsze niż na stałe zakodowane ścieżki, które od czasu do czasu powinny się zmieniać.

Anyhoo, przykład z podwójnymi cudzysłowami, w którym zmienne na ścieżce, którą globujesz, muszą się rozwijać. HTH

F1Linux
źródło