Làm cách nào để sử dụng ký tự đại diện (*) khi sao chép bằng scp?


144

Tại sao tôi không thể sao chép bằng scp khi tôi đang sử dụng các *ký tự trong đường dẫn?

scp SERVERNAME:/DIR/* .

SCP cần cấu hình gì để cho phép *trong đường dẫn?

CẬP NHẬT: vấn đề không nằm ở phía máy chủ; pscp đang cố gắng sử dụng SCPv1 và đó là lý do tại sao thông báo lỗi:

dòng lệnh scp và thông báo lỗi liên quan đến một tệp có tên *


Kiểm tra cái này, nó hoạt động với tôi: https://superuser.com/a/1390405/445746
AmitM

Câu trả lời:


126

Bạn cần phải vượt qua một lối thoát theo nghĩa đen scpđể tránh cỗ máy từ xa coi *như một quả địa cầu (lưu ý rằng nó được trích dẫn gấp đôi):

scp 'SERVERNAME:/DIR/\*' .

41
Bạn có thể cần dấu ngoặc kép hoặc dấu gạch chéo ngược trước ngôi sao, không phải cả hai. Và scp không phải là cái mở rộng nó, vỏ là.
Patrick

3
Bạn đã thử chưa? Tôi vừa làm, hoạt động chính xác như tôi đã mô tả (trích dẫn và thoát khỏi nguyên nhân thất bại). Người dùng 1274964 thậm chí xác nhận hành vi trong câu trả lời của mình. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Patrick

2
@Patrick Câu hỏi là về việc sử dụng dấu hoa thị theo nghĩa đen , nghĩa là tránh việc toàn cầu hóa, chứ không phải về cách làm thế nào để điều hướng trên điều khiển từ xa.
Chris Xuống

2
Trên thực tế, câu hỏi là về pscpphía khách hàng để cho phép toàn cầu hóa từ xa.
Patrick

1
Đúng, bạn không cần phải thoát dấu hoa thị nếu bạn đang sử dụng dấu ngoặc đơn
Led

52

Tôi thấy lời khuyên của Patrick là chính xác, mặc dù câu trả lời của Chris đã đưa tôi đi đúng hướng. Sử dụng dấu ngoặc kép và sau đó bạn không cần dấu gạch chéo ngược trước dấu hoa thị.

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

scp: /tmp/file_num*.csv: Không có tệp hoặc thư mục như vậy

scp 'SERVERNAME:/tmp/file_num*' .

phán đoán_for_job_171642.csv 100% 32KB 32.0KB / s 00:00
phán đoán_for_job_172394.csv 100% 548KB 182.6KB / s 00:03


4
Phải, bởi vì điều này có nghĩa là bạn muốn toàn cầu trên điều khiển từ xa. Câu hỏi đặt ra là làm thế nào để ngừng quảng cáo trên điều khiển từ xa (để có được nghĩa đen *), chứ không phải về cách chỉ toàn cầu trên điều khiển từ xa.
Chris Xuống

3
@ChrisDown. Không. Người dùng muốn ký tự đại diện không được mở rộng trên máy chủ và không muốn nó được mở rộng trên điều khiển từ xa, để cho phép nó khớp với nhiều tệp ở đó. Không có tệp nào được trả về có chữ '*' trong đó. Ý của bạn là " ngừng quảng cáo trên máy chủ "?
Tim Bird

1

LƯU Ý: Giải pháp được cung cấp dưới đây đã được thử nghiệm và được biết là hoạt động chính xác.

Các trích dẫn đơn sẽ phá vỡ sự mở rộng biến nếu bạn đặt bí danh cho một phần của đường dẫn mà bạn đang tạo ra.

Đây là một tập lệnh sử dụng các trích dẫn NHÂN ĐÔI cho trường hợp sử dụng của tên tệp được đặt tên toàn cầu-configure_ .tar.gz * bằng cách sử dụng một đường dẫn có bí danh với một biến:

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

Sau khi trích dẫn kép, mục tiêu thư mục cục bộ được xây dựng bằng cách chỉ trích xuất thư mục nhà của người dùng được chỉ định từ / etc / passwd .

Bản thân lệnh scp được mở đầu sshpass-o StrictHostKeyChecking=nođể tự động hóa hoàn toàn scplệnh mà không cần tương tác của người dùng. Có vẻ phức tạp nhưng tốt hơn so với các con đường mã hóa cứng được dự kiến ​​sẽ thay đổi theo thời gian.

Anyhoo, một ví dụ sử dụng dấu ngoặc kép trong đó các biến trong đường dẫn bạn đang cần phải được phép mở rộng. HTH

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.