Como usar caracteres curinga (*) ao copiar com scp?

144

Por que não consigo copiar com scp quando estou usando *caracteres no caminho?

scp SERVERNAME:/DIR/* .

Que configuração o SCP precisa para permitir *o caminho?

UPDATE: o problema não está no lado do servidor; O pscp está tentando usar o SCPv1, e é por isso que a mensagem de erro:

linha de comando scp e mensagem de erro em relação a um arquivo chamado *

LanceBaynes
fonte
Verifique isso, funcionou para mim: https://superuser.com/a/1390405/445746
AmitM

Respostas:

126

Você precisa passar por um escape literal scppara evitar que a máquina remota seja tratada *como glob (observe que ela é duplamente citada):

scp 'SERVERNAME:/DIR/\*' .
Chris Down
fonte
41
Você precisa de aspas ou uma barra invertida antes da estrela, não as duas. E scp não é quem está expandindo, é o shell.
Patrick
3
Tentaste? Acabei de fazer, funciona exatamente como descrevi (citar e escapar causa falha). O usuário1274964 até confirma o comportamento em sua resposta. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Patrick
2
@Patrick A questão é sobre o uso de um asterisco literal , ou seja, evitar o globbing por completo, não sobre como fazer glob no controle remoto.
Chris Baixo
2
Na verdade, a pergunta é sobre entrar pscpno lado do cliente para permitir globbing remoto.
Patrick
11
Yep você não precisa escapar o asterisco se você estiver usando as aspas simples
Liderados
52

Achei o conselho de Patrick correto, embora a resposta de Chris tenha me colocado no caminho certo. Use aspas e não precisará da barra invertida antes do asterisco.

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

scp: /tmp/file_num*.csv: esse arquivo ou diretório não existe

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

user1274964
fonte
4
Certo, porque isso significa que você deseja fazer glob no controle remoto. A questão é sobre como parar de olhar no controle remoto (para obter um literal *), e não sobre como ficar apenas no controle remoto.
Chris Baixo
3
@ChrisDown. Não. O usuário deseja que o curinga não seja expandido no host e deseja que ele seja expandido no controle remoto, para permitir que ele corresponda a vários arquivos. Nenhum dos arquivos retornados possui um '*' literal. Você quis dizer " pare de olhar para o anfitrião "?
Tim Bird
1

NOTA: A solução oferecida abaixo foi testada e conhecida por funcionar corretamente.

As aspas simples interromperão a expansão variável se você tiver aliasado parte do caminho que está observando.

Aqui está um script que usa DUPLAS cotações para o caso de uso do globbed filename -configure_ comando .tar.gz * usando um caminho alias com uma variável:

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

Após a citação dupla de fechamento, o destino do diretório local é construído extraindo apenas o diretório inicial do usuário especificado em / etc / passwd .

O próprio comando scp é precedido sshpasse -o StrictHostKeyChecking=noautomatiza completamente o scpcomando sem a interação do usuário. Parece complicado, mas melhor do que os caminhos de codificação que devem mudar de tempos em tempos.

Anyhoo, um exemplo usando aspas duplas em que variáveis ​​no caminho que você está procurando precisam expandir. HTH

F1Linux
fonte