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

scp SERVERNAME:/DIR/* .


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

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



评论

检查一下,它对我有用:https://superuser.com/a/1390405/445746

关于是否要使用*进行文件遍历还是要复制名为*的文件,问题尚不清楚(请参阅注释中有关该问题的分歧)。

#1 楼

您需要将字面量转义传递给scp,以避免远程机器将*视为glob(注意,它被双引号引起了):

scp 'SERVERNAME:/DIR/\*' .


评论


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

–干粉
2011-12-23在4:39



你试过了吗?我照做了,完全按照我的描述工作(引用和转义会导致失败)。 User1274964甚至在其答案中确认行为。触摸/tmp/abcd.1234; scp'localhost:/ tmp / abcd。\ *'./:scp:/tmp/abcd.*:没有这样的文件或目录

–干粉
2013年12月7日1:00



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

–克里斯唐(Chris Down)
2013年12月8日20:57



实际上,问题是关于在客户端获取pscp以允许远程glob。

–干粉
2013年12月8日22:08



是的,如果您使用单引号,则无需转义星号

–领导
18-10-23在15:22

#2 楼

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



带引号和反斜杠:

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

scp: /tmp/file_num*.csv: No such file or directory



仅带引号:

$ 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  




评论


是的,因为这意味着您想在遥控器上进行切换。问题是关于如何停止在远程服务器上进行切换(获取文字*),而不是仅如何在远程设备上进行切换。

–克里斯唐(Chris Down)
2013年12月8日20:57



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

–提姆·伯德(Tim Bird)
16 Sep 7'在19:38



#3 楼

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

如果您在要遍历的路径中使用了部分别名,则单引号会破坏变量扩展。

这里是一个脚本,该脚本使用别名加变量的路径对全局文件名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

#4 楼

为了避免出现乱码,您需要同时使用-单引号和转义的星号:

 scp 'SERVERNAME:/DIR/\*' ./
 


当您要使用通配符时,请使用单引号或仅对星号进行转义:

 scp 'SERVERNAME:/DIR/*' ./
# or
scp SERVERNAME:/DIR/\* ./
 


似乎scp仅支持对文件名使用通配符,但不支持目录名。

#5 楼

好吧,实际上在类似情况下只需使用-r。特别是如果您在脚本中使用变量。
示例:
SERVERNAME="root@example.com"

scp -r $SERVERNAME:/DIR/ ./