Jag har två avlägsna noder som jag försöker skicka filer från en till en annan.
scp remote1:~/testSCP [email protected]:~/
Jag har ~/ssh/config
inställt i min lokala maskin så den använder port 2222
som standard.
Men fjärrkontrollens standard ssh-port är inställd på 22
i ssh-konfigurationen istället för port 2222
. Så, för att göra extern anslutning via ssh, den använder port 22
som standard.
Jag försökte följande som inte fungerade:
scp -P 2222 remote1:~/testSCP [email protected]:~/
Försökte även följande, vilket inte heller fungerade:
scp remote1:~/testSCP -P 2222 [email protected]:~/
För båda fick jag följande fel:
ssh: connect to host 10.0.1.10 port 22: Connection refused lost connection
Vilket är sant eftersom 10.0.1.10
använder port 2222
och inte port 22
.
Hur kan jag ange remote1 för att använda port 2222
när jag försöker skicka filer till (remote2) från remote1
?
Uppdatering
Efter att ha försökt
scp -3 remote1:~/testSCP [email protected]:~/
Jag får konstigt beteende. Trots att mitt lösenord är korrekt ger det mig följande utdata:
[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:
Jag har inte aktiverat nyckelfri autentisering än.
Ny uppdatering
Efter att ha testat det på flera sätt kunde jag göra det i mina skript genom att logga in på fjärrkontrollen 1 via ssh från min lokala värd och sedan scp från fjärrkontroll1 till fjärrkontroll2. Detta svarar dock inte på min fråga. Jag tänkte göra det direkt från min lokala maskin och sedan överföra filer mellan två instanser, vilket jag tror inte stöds om två instanser ”ssh-demoner använder en annan port än standard för ssh-anslutning.
Kommentarer
Svar
Du kan inte göra det med en enkel fjärr-till-fjärr-scp [1].
Istället för det, ssh till den första fjärrvärden och kör scp med ett portargument därifrån:
ssh -p 2222 ruser1@rhost1 scp -P 2222 /rpath/1 ruser2@rhost2:/rpath/2
Om du vill göra exakt vad scp
gör kan du också lägga till -n -x -oClearAllForwardings=yes
-alternativen till ssh
, även om det vanligtvis inte behövs.
[1]: nyare versioner av scp
stöder en uri-specifikation (inklusive en port) istället för host:path
, men bara när du använder alternativet -3
(”passera den lokala värden”).
Så du kan förmodligen använda
scp -3 -P 2222 ruser1@rhost1:/rpath/1 scp://ruser2@rhost2:2222//rpath/2
(märker att /
efter host[:port]
är inte en del av sökvägen – hänvisar till ./file
i user
” s hemkatalog).
Men kopiering via localhost är både långsammare och enligt min erfarenhet kommer det att dölja fel. Till exempel kommer detta inte att skriva ut något felmeddelande trots att det inte går att skapa någon /foo/bar/baz
-fil:
scp -3 localhost:.bashrc localhost:/foo/bar/baz
Jag kom inte på något djup i detta – bara undvek det 😉
Om någon inte är övertygad om allt detta kan de titta på källkod :
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"); }
Observera att variabeln tport
endast är inställd genom att analysera en scp://
uri, och den existerar helt enkelt inte i versioner äldre än 7.6p1 (okt 2017).
Kommentarer
- Kan du förklara vad
-x -oClearAllForwardings=yes
det här alternativet gör i ditt svar tack? Jag tänkte också om det går att användarsync
istället. -
-x
inaktiverar vidarebefordran av X11 och-oClear..
inaktiverar alla tcp-vidarebefordran (om någon av dem tvingades via~/.ssh/config
eller/etc/ssh/ssh_config
) - @RakibFiha rsync säger: " Källan och destinationen kan inte båda vara avlägsna ". Kanske finns det knep runt det, men det borde vara en separat fråga.
- Nu måste jag inse det efter din detaljerade förklaring. (y)
~/.ssh/config
I fjärrkontroll 1 och fjärrkontroll är standardporten i ~ / .ssh / config oförändrad så dess standardport 22. Jag kan redigera dem, men jag skulle vilja göra det med hjälp av en enlinje istället för att redigera varje ssh-konfiguration varje gång.ssh
till en till fjärrvärdarna och utfärda en enkelscp
därifrån, eller göra det i en rad med något somssh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'
. Du kommer inte heller att ' måste redigeraconfig
filer en gång: bara en gång för varje värdpar (t.ex. ställa in port för ansluta tillremote2
påremote1
), men naturligtvis kan du vara obekväm med detta, beroende på antalet värdar du har.