Jeg har to eksterne knudepunkter, som jeg prøver at sende filer fra den ene til den anden.
scp remote1:~/testSCP [email protected]:~/
Jeg har ~/ssh/config
opsat i min lokale maskine, så den bruger port 2222
som standard.
Men fjernbetjeningens standard ssh-port er indstillet til 22
i ssh-konfigurationen i stedet for port 2222
. Så for at lave enhver ekstern forbindelse via ssh, den bruger port 22
som standard.
Jeg prøvede følgende, som ikke fungerede:
scp -P 2222 remote1:~/testSCP [email protected]:~/
Prøvede også følgende, hvilket heller ikke fungerede:
scp remote1:~/testSCP -P 2222 [email protected]:~/
For begge fik jeg følgende fejl:
ssh: connect to host 10.0.1.10 port 22: Connection refused lost connection
Hvilket er sandt, da 10.0.1.10
bruger port 2222
og ikke port 22
.
Hvordan kan jeg specificere remote1 til at bruge port 2222
når jeg prøver at sende filer til (remote2) fra remote1
?
Opdatering
Efter at have prøvet
scp -3 remote1:~/testSCP [email protected]:~/
Jeg får underlig opførsel. Selvom min adgangskode er korrekt, giver det mig følgende output:
[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 endnu ikke aktiveret nøglefri godkendelse.
Ny opdatering
Efter at have prøvet det på flere måder, var jeg i stand til at gøre det i mine scripts ved at logge ind på remote1 via ssh fra min localhost og derefter scp fra remote1 til remote2. Dette svarer dog ikke på mit spørgsmål. Jeg havde til hensigt at gøre det direkte fra min lokale maskine og derefter overføre filer mellem to forekomster, som jeg tror ikke understøttes, hvis to forekomster “ssh-dæmoner bruger en anden port end standard for ssh-forbindelse.
Kommentarer
Svar
Du kan ikke gøre det med en simpel fjern-til-fjern scp [1].
I stedet for det skal du ssh til den 1. eksterne vært og køre scp med et portargument derfra:
ssh -p 2222 ruser1@rhost1 scp -P 2222 /rpath/1 ruser2@rhost2:/rpath/2
Hvis du vil gøre præcis, hvad scp
gør, kan du også føje -n -x -oClearAllForwardings=yes
til ssh
, selvom det normalt ikke er nødvendigt.
[1]: nyere versioner af scp
understøtter en uri-specifikation (inklusive en port) i stedet for host:path
, men kun når du bruger indstillingen -3
(“gå gennem den lokale vært”).
Så du kunne sandsynligvis bruge
scp -3 -P 2222 ruser1@rhost1:/rpath/1 scp://ruser2@rhost2:2222//rpath/2
(bemærk, at /
efter host[:port]
er ikke en del af stien – henviser til ./file
i user
” s hjemmekatalog).
Men kopiering gennem localhost er begge langsommere, og efter min erfaring vil det skjule fejl. For eksempel vil dette ikke udskrive nogen fejlmeddelelse på trods af ikke at kunne oprette nogen /foo/bar/baz
-fil:
scp -3 localhost:.bashrc localhost:/foo/bar/baz
Jeg kom ikke dybt ind i dette – bare undgik det 😉
Hvis nogen 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"); }
Bemærk, at tport
variablen kun er indstillet ved at analysere en scp://
uri, og den findes simpelthen ikke i versioner ældre end 7.6p1 (okt. 2017).
Kommentarer
- Kunne du forklare, hvad
-x -oClearAllForwardings=yes
denne mulighed gør i dit svar tak? Jeg tænkte også, om det kan gøres ved hjælp afrsync
i stedet. -
-x
deaktiverer X11-videresendelse og-oClear..
deaktiverer alle tcp-videresendelser (hvis nogen af dem blev tvunget via~/.ssh/config
eller/etc/ssh/ssh_config
) - @RakibFiha rsync siger: " Kilden og destinationen kan ikke begge være fjerntliggende ". Måske er der tricks omkring det, men det burde være et separat spørgsmål.
- Nu må jeg indse det efter din detaljerede forklaring. (y)
~/.ssh/config
I fjernbetjening 1 og fjernbetjening er standardporten i ~ / .ssh / config uændret, så dens standardport 22. Jeg kan redigere dem, men jeg vil gerne gøre det ved hjælp af en one-liner i stedet for at redigere hver ssh-konfiguration hver eneste gang.ssh
ind i en til fjernværterne og udstede en simpelscp
derfra, eller gøre det i en linje med noget somssh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'
. Du vil ikke ' ikke skulle redigereconfig
filer på en gang: kun en gang for hvert par værter (f.eks. Indstilling af port til opretter forbindelse tilremote2
påremote1
), men du kan selvfølgelig være ubehagelig med dette afhængigt af antallet af værter du har.