Hur anger jag port för scp för en fjärrserver?

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

  • stackoverflow.com/questions/10341032/… kan hjälpa dig
  • Jag försökte dem som jag nämnde i min fråga. Verkade inte fungera för mig
  • localhost lyssnade på port 22 men i ssh config är det specificerat för både remote1 till remote2 till port 2222. Ja, jag menade ~/.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.
  • Ok. Jag ' föreslår att du redigerar din fråga, lägga till att du kan, men inte ' inte vill, redigera din filer. Sedan kan du ssh till en till fjärrvärdarna och utfärda en enkel scp därifrån, eller göra det i en rad med något som ssh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'. Du kommer inte heller att ' måste redigera config filer en gång: bara en gång för varje värdpar (t.ex. ställa in port för ansluta till remote2remote1), men naturligtvis kan du vara obekväm med detta, beroende på antalet värdar du har.
  • Ja, det svarar på din fråga. " Nej " är ett svar och är svaret , oavsett om du gillar det eller inte.

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ända rsync 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)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *