Tenho dois nós remotos que estou tentando enviar um para o outro.
scp remote1:~/testSCP [email protected]:~/
Eu tenho ~/ssh/config
configurado em minha máquina local, então, está usando a porta 2222
por padrão.
Mas a porta ssh padrão do remote1 “s é definida como 22
na configuração do ssh em vez da porta 2222
. Então, para fazer qualquer conexão externa via ssh, ele usa a porta 22
por padrão.
Tentei o seguinte, mas não funcionou:
scp -P 2222 remote1:~/testSCP [email protected]:~/
Também tentei o seguinte, que também não funcionou:
scp remote1:~/testSCP -P 2222 [email protected]:~/
Para ambos, obtive o seguinte erro:
ssh: connect to host 10.0.1.10 port 22: Connection refused lost connection
O que é verdade, pois 10.0.1.10
está usando a porta 2222
e não a porta 22
.
Como posso especificar remote1 para usar a porta 2222
ao tentar enviar arquivos para (remote2) de remote1
?
Atualizar
Depois de tentar
scp -3 remote1:~/testSCP [email protected]:~/
Tenho um comportamento estranho. Mesmo que minha senha esteja correta, ela está me dando o seguinte resultado:
[email protected]"s password: [email protected]"s password: Permission denied, please try again. [email protected]"s password: Permission denied, please try again. [email protected]"s password:
Ainda não habilitei a autenticação sem chave.
Nova atualização
Depois de tentar de várias maneiras, fui capaz de fazer isso em meus scripts, logando no remote1 via ssh do meu localhost e depois scp do remote1 para o remote2. No entanto, isso não responde à minha pergunta. Eu pretendia fazer isso diretamente da minha máquina local e, em seguida, transferir arquivos entre duas instâncias, o que eu acho que não é suportado se duas instâncias “daemons ssh estão usando uma porta diferente do padrão para a conexão ssh.
Comentários
Resposta
Você não pode fazer isso com um simples scp remoto para remoto [1].
Em vez disso, execute ssh para o primeiro host remoto e execute scp com um argumento de porta a partir daí:
ssh -p 2222 ruser1@rhost1 scp -P 2222 /rpath/1 ruser2@rhost2:/rpath/2
Se você quiser fazer exatamente o que scp
está fazendo, também pode adicionar as -n -x -oClearAllForwardings=yes
opções a ssh
, embora isso “geralmente não seja necessário.
[1]: versões mais recentes de scp
suportam uma especificação de uri (incluindo uma porta) em vez de host:path
, mas apenas ao usar a opção -3
(“passar pelo host local”).
Então, você provavelmente poderia usar
scp -3 -P 2222 ruser1@rhost1:/rpath/1 scp://ruser2@rhost2:2222//rpath/2
(observe que /
após host[:port]
não faz parte do caminho – se referirá a ./file
no user
” diretório inicial).
Mas copiar através do localhost é mais lento e, na minha experiência, esconde erros. Por exemplo, isso não imprimirá nenhuma mensagem de erro, apesar de não ser capaz de criar nenhum /foo/bar/baz
arquivo:
scp -3 localhost:.bashrc localhost:/foo/bar/baz
Não cheguei a qualquer profundidade nisso – apenas evitei 😉
Se alguém não está convencido de tudo isso, eles podem olhar para o código-fonte :
void toremote(char *targ, int argc, char **argv) { ... } else if (host) { /* standard remote to remote */ if (tport != -1 && tport != SSH_DEFAULT_PORT) { /* This would require the remote support URIs */ fatal("target port not supported with two " "remote hosts without the -3 option"); }
Observe que a variável tport
está apenas definida ao analisar um scp://
uri, e ele simplesmente não existe em versões anteriores a 7.6p1 (outubro de 2017).
Comentários
- Você poderia explicar o que
-x -oClearAllForwardings=yes
esta opção está fazendo em sua resposta, por favor? Eu também estava pensando se isso pode ser feito usandorsync
em vez disso. -
-x
desativa o encaminhamento X11 e-oClear..
desativa todos os encaminhamentos tcp (caso algum deles tenha sido forçado por~/.ssh/config
ou/etc/ssh/ssh_config
) - @RakibFiha rsync diz: " A origem e o destino não podem ser remotos ". Talvez haja truques em torno disso, mas essa deve ser uma questão separada.
- Agora, eu tenho que perceber isso após sua explicação detalhada. (y)
~/.ssh/config
Em remote 1 e remote, a porta padrão em ~ / .ssh / config permanece inalterada, então sua porta padrão 22. Posso editá-las, mas gostaria de fazer isso usando uma linha, em vez de editar todas as configurações de ssh todas as vezes.ssh
em um para os hosts remotos e emitir umscp
simples de lá, ou fazê-lo em uma linha com algo comossh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'
. Além disso, você não ' terá que editarconfig
arquivos a qualquer momento: apenas uma vez para cada par de hosts (por exemplo, configurando a porta para conectando-se aremote2
emremote1
), mas é claro que você pode se sentir desconfortável com isso, dependendo do número de hosts que você tem.