Hvordan spesifiserer port for scp for en ekstern server?

Jeg har to eksterne noder som jeg prøver å sende filer fra en til en annen.

scp remote1:~/testSCP [email protected]:~/ 

Jeg har ~/ssh/config satt opp i min lokale maskin, så den bruker port 2222 som standard.

Men fjernkontrollens standard ssh-port er satt til 22 i ssh-konfigurasjonen i stedet for port 2222. ekstern tilkobling via ssh, den bruker port 22 som standard.

Jeg prøvde følgende som ikke fungerte:

scp -P 2222 remote1:~/testSCP [email protected]:~/ 

Prøvde også følgende, som heller ikke fungerte:

scp remote1:~/testSCP -P 2222 [email protected]:~/ 

For begge fikk jeg følgende feil:

ssh: connect to host 10.0.1.10 port 22: Connection refused lost connection 

Hvilket er sant siden 10.0.1.10 bruker port 2222 og ikke port 22.

Hvordan kan jeg spesifisere remote1 for å bruke port 2222 når jeg prøver å sende filer til (ekstern2) fra remote1?

Oppdater

Etter å ha prøvd

 scp -3 remote1:~/testSCP [email protected]:~/ 

Jeg får rar oppførsel. Selv om passordet mitt er riktig, gir det meg følgende 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: 

Jeg har ikke aktivert nøkkelfri autentisering ennå.

Ny oppdatering

Etter å ha prøvd det på flere måter, var jeg i stand til å gjøre det i skriptene mine ved å logge på fjernkontrollen 1 via ssh fra localhost og deretter scp fra fjernkontroll1 til fjernkontroll2. Dette svarer imidlertid ikke på spørsmålet mitt. Jeg hadde til hensikt å gjøre det direkte fra min lokale maskin og deretter overføre filer mellom to forekomster, som jeg tror ikke støttes hvis ssh-demoner fra to forekomster bruker en annen port enn standard for ssh-tilkobling.

Kommentarer

  • stackoverflow.com/questions/10341032/… kan hjelpe deg
  • Jeg prøvde dem som jeg nevnte i spørsmålet mitt. Virket ikke som å fungere for meg
  • localhost lytter til port 22, men i ssh config er det spesifisert for både remote1 til remote2 til port 2222. Ja, jeg mente ~/.ssh/config I fjernkontroll 1 og fjernkontroll er standardporten i ~ / .ssh / config uendret, så standardporten 22. Jeg kan redigere dem, men jeg ønsker å gjøre det ved hjelp av en en-liner, i stedet for å redigere hver ssh-konfigurasjon hver gang.
  • Ok. Jeg ' jeg foreslår å redigere spørsmålet ditt, legge til at du kan, men ikke er ' t villig til å redigere filer. Deretter kan du ssh til en til de eksterne vertene og utstede en enkel scp derfra, eller gjøre det i en linje med noe som ssh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'. Du vil ikke ' ikke trenger å redigere config filer en gang: bare en gang for hvert par verter (f.eks. Angi porten for koble til remote2remote1), men du kan selvfølgelig være ukomfortabel med dette, avhengig av antall verter du har.
  • Ja, det svarer på spørsmålet ditt. " Nei " er et svar og er svaret , uansett om du liker det eller ikke.

Svar

Du kan ikke gjøre det med en enkel fjern-til-ekstern scp [1].

I stedet for det, ssh til den første eksterne verten og kjør scp med et portargument derfra:

ssh -p 2222 ruser1@rhost1 scp -P 2222 /rpath/1 ruser2@rhost2:/rpath/2 

Hvis du vil gjøre akkurat det scp gjør, kan du også legge til -n -x -oClearAllForwardings=yes -alternativene til ssh, selv om det vanligvis ikke er nødvendig.


[1]: nyere versjoner av scp støtter en uri-spesifikasjon (inkludert en port) i stedet for host:path, men bare når du bruker alternativet -3 («gå gjennom den lokale verten»).

Så du kan sannsynligvis bruke

scp -3 -P 2222 ruser1@rhost1:/rpath/1 scp://ruser2@rhost2:2222//rpath/2 

(legg merke til at / etter host[:port] er ikke en del av banen – vil referere til ./file i user» s hjemmekatalog).

Men kopiering gjennom localhost er begge langsommere, og etter min erfaring vil det skjule feil. For eksempel vil ikke dette skrive ut noen feilmelding, til tross for at den ikke kan opprette noen /foo/bar/baz -fil:

scp -3 localhost:.bashrc localhost:/foo/bar/baz 

Jeg kom ikke i dybden med dette – bare unngikk det 😉


Hvis noen ikke er overbevist om alt dette, kan de se på kildekode :

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"); } 

Legg merke til at tport variabelen bare er angitt ved å analysere en scp:// uri, og den eksisterer ganske enkelt ikke i versjoner eldre enn 7.6p1 (okt 2017).

Kommentarer

  • Kan du forklare hva -x -oClearAllForwardings=yes dette alternativet gjør i svaret ditt? Jeg tenkte også om det kan gjøres ved å bruke rsync i stedet.
  • -x deaktiverer X11-videresending og -oClear.. deaktiverer alle tcp-videresendinger (i tilfelle noen av dem ble tvunget via ~/.ssh/config eller /etc/ssh/ssh_config)
  • @RakibFiha rsync sier: " Kilden og destinasjonen kan ikke begge være ekstern ". Kanskje det er triks rundt det, men det burde være et eget spørsmål.
  • Nå fikk jeg innse det etter din detaljerte forklaring. (y)

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *