Comando SCP com arquivos e diretórios selecionados para download, solicite senha para cada novo arquivo ou diretório

9

No meu sistema Fedora 20 eu uso muito o scp, e é a segunda vez que encontro isso, quando 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"

Questão:

O que esta acontecendo aqui?

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

alguma coisa alguma coisa
fonte

Respostas:

13

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

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

para dentro:

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ê souber que o shell de login do usuário na extremidade remota é bash, também pode 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 sequência em argumentos, em vez do shell local.

Geirha
fonte
5

Sim, é normal. O que acontece é que 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, scpvê várias solicitações de conexão, portanto, abre uma nova conexão para cada uma delas. Mão únicaA maneira mais simples(usar aspas, como sugerido por @geirha, é mais simples para uma operação pontual), resolver isso é configurar sem senha ssh/ scp:

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

Depois de executar esses dois comandos uma vez (e responder às solicitações conforme necessário), você poderá ssh/ scpsem usar uma senha para todas as conexões ssh futuras. Este é i) realmente mais seguro e ii) muito mais conveniente.

terdon
fonte
+1, de maneira legal (é claro que o ssh-keygen & ssh-copy-id deve ser feito apenas uma vez). Eu diria que é mais seguro ... somente se você garantir que a parte privada seja "inacessível" por qualquer pessoa, exceto pelo usuário ... O que nem sempre é fácil.
Olivier Dulac
@OlivierDulac, o que você quer dizer? O id.rsaterá 600permissões por padrão e sshnem funcionará se não tiver. Isso significa que é seguro para qualquer pessoa, mas que rootnada é realmente seguro root, certamente não senhas.
terdon
Eu apenas pretendia adicionar esse comentário, para que as pessoas que configuram um acesso sem senha levem em conta (e entendam) o fato de que a chave privada precisa estar em um ambiente seguro e ilegível / não compartilhado / etc. (ou seja, é uma forma suave para apontar isso, como os perguntando não pode saber todas as implicações que partilha / deixar a chave privada ser acessado poderia ter)
Olivier Dulac
@OlivierDulac ah, é justo. Eu não acho que vale a pena mencionar, porque 1) acontece automaticamente ao usar ssh-keygene 2) o ssh / scp reclama e solicita uma senha se o arquivo for legível por mais alguém. Pelo menos no Linux de qualquer maneira.
terdon
4

scp não é muito inteligente: quando são fornecidos 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 em rsyncvez de scp, é mais inteligente dessa maneira (e de outras maneiras).

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 scpdescrever vários arquivos .

Uma abordagem diferente é configurar o sistema para que você não precise se autenticar o tempo todo. De preferência, configure a autenticação de chave , que na maioria dos cenários é mais conveniente e mais segura. Como alternativa, ou além disso, configure o compartilhamento de conexão , para que você só precise se autenticar uma vez por sessão. De qualquer forma, configure um alias para não precisar especificar o nome de usuário e a porta sempre. 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 nickpara abrir uma conexão e, em seguida, todas as conexões subseqüentes nickserão transferidas para a conexão existente. Agora você pode simplesmente correr

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
Gilles 'SO- parar de ser mau'
fonte