使用scp复制时如何使用通配符(*)?


144

*在路径中使用字符时,为什么不能使用scp复制?

scp SERVERNAME:/DIR/* .

SCP需要什么配置才能进入*路径?

更新:问题不在服务器端;pscp试图使用SCPv1,这就是错误消息的原因:

scp命令行和有关名为*的文件的错误消息


检查一下,它对我
有用

Answers:


126

您需要传递一个文字转义符,scp以避免将远程计算机*视为glob(注意,它被双重引用):

scp 'SERVERNAME:/DIR/\*' .

41
您可能需要在双引号之前加引号或使用反斜杠,而不是两者都用。scp不是扩展它的,shell是。
Patrick

3
你试过了吗?我照做了,完全按照我的描述工作(引用和转义会导致失败)。User1274964甚至在其答案中确认行为。touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./scp: /tmp/abcd.*: No such file or directory
Patrick

2
@Patrick问题是关于使用文字星号,即完全避免乱码,而不是如何在遥控器上乱码。
克里斯·

2
实际上,问题是关于pscp在客户端允许远程glob。
帕特里克

1
是的,如果您使用单引号,则不需要转义星号
Led

52

我发现Patrick的建议是正确的,尽管Chris的回答使我步入正轨。使用引号,然后在星号前不需要反斜杠。

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

scp:/tmp/file_num*.csv:没有这样的文件或目录

scp 'SERVERNAME:/tmp/file_num*' .

判决书_for_job_171642.csv 100%32KB 32.0KB / s 00:00
判决书_for_job_172_cs.cv 100%548KB 182.6KB / s 00:03


4
正确,因为这意味着您在遥控器上进行切换。问题是关于如何停止远程控制(获取文字*),而不是仅如何远程控制。
克里斯·

3
@ChrisDown。否。用户希望通配符不在主机上扩展,并且确实希望通配符在远程主机上扩展,以允许通配符在那里匹配多个文件。返回的文件中都没有文字“ *”。您的意思是“ 停止主机上滚动”吗?
蒂姆·伯德

1

注意:下面提供的解决方案经过测试,已知可以正常工作。

如果您已别名遍历了路径的一部分,则引号将破坏变量扩展。

这是一个脚本,该脚本使用别名加上变量的路径来对全局文件名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,使用双引号的示例,其中您要遍历的路径中的变量需要允许扩展。高温超导

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.