Bagaimana cara menggunakan wildcard (*) saat menyalin dengan scp?

144

Mengapa saya tidak bisa menyalin dengan scp ketika saya menggunakan *karakter di jalur?

scp SERVERNAME:/DIR/* .

Konfigurasi apa yang dibutuhkan SCP untuk memungkinkan *di jalur?

PEMBARUAN: masalahnya bukan pada sisi server; pscp sedang mencoba menggunakan SCPv1, dan itulah sebabnya pesan kesalahan:

scp commandline dan pesan kesalahan tentang file bernama *

LanceBaynes
sumber
Lihat ini, itu berhasil untuk saya: https://superuser.com/a/1390405/445746
AmitM

Jawaban:

126

Anda harus melewati pelarian harfiah scpuntuk menghindari mesin jarak jauh yang memperlakukan *sebagai gumpalan (perhatikan bahwa ini dikutip dua kali lipat):

scp 'SERVERNAME:/DIR/\*' .
Chris Down
sumber
41
Anda membutuhkan tanda kutip, atau garis miring terbalik sebelum bintang, bukan keduanya. Dan scp bukan yang mengembangkannya, shell itu.
Patrick
3
Sudahkah Anda mencobanya? Saya baru saja melakukannya, bekerja persis seperti yang saya jelaskan (mengutip dan melarikan diri menyebabkan kegagalan). User1274964 bahkan mengkonfirmasi perilaku dalam jawabannya. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Patrick
2
@ Patrick Pertanyaannya adalah tentang menggunakan tanda bintang literal , yaitu, menghindari globbing sama sekali, bukan tentang bagaimana glob pada remote.
Chris Down
2
Sebenarnya pertanyaannya adalah tentang mendapatkan pscpdi sisi klien untuk memungkinkan globbing jarak jauh.
Patrick
1
Yap, Anda tidak perlu keluar dari asterisk jika Anda menggunakan tanda kutip tunggal
Led
52

Saya menemukan saran Patrick itu benar, walaupun jawaban Chris membuat saya di jalur yang benar. Gunakan tanda kutip dan Anda tidak perlu garis miring terbalik sebelum tanda bintang.

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

scp: /tmp/file_num*.csv: Tidak ada file atau direktori tersebut

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

pengguna1274964
sumber
4
Benar, karena ini berarti Anda ingin glob di remote. Pertanyaannya adalah tentang bagaimana menghentikan globbing pada remote (untuk mendapatkan literal *), bukan tentang bagaimana glob pada remote saja.
Chris Down
3
@ChrisDown. Tidak. Pengguna ingin wildcard tidak diperluas pada host, dan memang ingin diperluas pada remote, untuk memungkinkannya untuk mencocokkan beberapa file di sana. Tak satu pun dari file yang dikembalikan memiliki '*' literal di dalamnya. Apakah maksud Anda " berhenti mencari- cari di host "?
Tim Bird
1

CATATAN: Solusi yang ditawarkan di bawah ini telah diuji dan diketahui berfungsi dengan benar.

Kutipan tunggal akan memecah ekspansi variabel jika Anda telah alias bagian dari jalan yang Anda globbing.

Berikut ini adalah skrip yang menggunakan tanda kutip DOUBLE untuk kasus penggunaan nama file globbed command-configure_ .tar.gz * menggunakan path alias dengan variabel:

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

Setelah kutip ganda penutup, target direktori lokal dibuat dengan hanya mengekstrak dir home user yang ditentukan dari / etc / passwd .

Perintah scp sendiri diawali dengan sshpassdan -o StrictHostKeyChecking=nountuk mengotomatisasi sepenuhnya scpperintah tanpa interaksi pengguna. Terlihat berbelit-belit tetapi lebih baik daripada jalur hard-coding yang diharapkan berubah dari waktu ke waktu.

Anyhoo, contoh menggunakan tanda kutip ganda di mana variabel di jalur yang Anda globbing perlu diizinkan untuk berkembang. HTH

F1Linux
sumber