*
字符时,为什么不能用scp复制?scp SERVERNAME:/DIR/* .
SCP需要什么配置才能允许
*
进入路径? 更新:问题不在服务器端; pscp尝试使用SCPv1,这就是错误消息的原因:
#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/ ./
评论
检查一下,它对我有用:https://superuser.com/a/1390405/445746关于是否要使用*进行文件遍历还是要复制名为*的文件,问题尚不清楚(请参阅注释中有关该问题的分歧)。