O comando SCP com o arquivo e diretórios selecionados para o download pede a senha para cada novo arquivo ou diretório

9

No meu sistema Fedora 20 eu uso scp muito, e esta é a segunda vez que eu encontro isso, quando eu executo este comando:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

ele me pede a senha para cada arquivo / diretório que ele transfere.

user@host's password: "password here"

Pergunta:

O que está acontecendo aqui?

Isso é normal, eu acho que isso é um comportamento muito peculiar?

    
por somethingSomething 10.11.2014 / 14:47

3 respostas

13

Seu shell local (provavelmente o bash) está se expandindo

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}

para:

user@host:/home/user/something/file1 user@host:/home/user/something/folder1 user@host:/home/user/something/folder2 user@host:/home/user/something/folder3 user@host:/home/user/something/folder4

Em vez disso, você pode fazer:

scp -r -P PORT user@host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/

ou, se você sabe que o shell de login do usuário no terminal remoto é bash, também é possível usar a expansão de chaves:

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/

para que o shell remoto divida a string em argumentos em vez do shell local.

    
por 10.11.2014 / 15:06
5

Sim, é normal. O que acontece é que o seu shell expande as chaves antes de executar o comando, então o que você está realmente executando é

scp -r -P PORT user@host:/home/user/something/file1 \ 
               user@host:/home/user/something/folder1 \ 
               user@host:/home/user/something/folder3 \ 
               user@host:/home/user/something/folder4 folder/folder2

Basicamente, scp vê várias solicitações de conexão, então abre uma nova conexão para cada uma delas. Uma maneira A forma mais simples de usar aspas, como sugerido pelo @geirha é mais simples para uma operação única, é resolver o problema sem senha ssh / scp :

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host

Depois de executar esses dois comandos uma vez (e responder aos prompts conforme necessário), você poderá ssh / scp sem usar uma senha para todas as futuras conexões ssh. Isto é i) realmente mais seguro e ii) muito mais conveniente.

    
por 10.11.2014 / 15:05
4

scp não é muito inteligente: quando recebe vários argumentos de linha de comando que são arquivos do mesmo host remoto, ele abre uma nova conexão para cada argumento.

Você pode usar rsync em vez de scp , é mais inteligente assim (e de outras formas).

rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

Outra abordagem é passar um único argumento para scp que descreve vários arquivos .

Uma abordagem diferente é configurar seu sistema para que você não precise autenticar o tempo todo. De preferência, configura a autenticação de chaves , que está na maioria dos cenários ambos mais convenientes e mais seguros. Como alternativa, ou além disso, configure o compartilhamento de conexão , para que você só precise autenticar uma vez por sessão. Em qualquer caso, configure um alias para que você não precise especificar o nome de usuário e a porta todas as vezes. No seu ~/.ssh/config :

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Host nick
HostName real-host-name.example.com
User bob
Port 1234

Execute ssh -Nf nick para abrir uma conexão e todas as conexões subseqüentes a nick serão conectadas à conexão existente. Agora você pode simplesmente executar

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
    
por 11.11.2014 / 03:03