Mám dva vzdálené uzly, které se pokouším posílat soubory z jednoho do druhého.
scp remote1:~/testSCP [email protected]:~/
Mám ~/ssh/config
nastaven v místním počítači, takže ve výchozím nastavení používá port 2222
.
Výchozí port ssh vzdáleného1 je ale v konfiguraci ssh nastaven na 22
místo na port 2222
. externí připojení přes ssh, ve výchozím nastavení používá port 22
.
Zkoušel jsem následující, které nefungovalo:
scp -P 2222 remote1:~/testSCP [email protected]:~/
Také jsem vyzkoušel následující, což také nefungovalo:
scp remote1:~/testSCP -P 2222 [email protected]:~/
U obou se mi zobrazila následující chyba:
ssh: connect to host 10.0.1.10 port 22: Connection refused lost connection
Což je pravda, protože 10.0.1.10
používá port 2222
a ne port 22
.
Jak mohu určit remote1, aby používal port 2222
při pokusu o odeslání souborů na (remote2) z remote1
?
Aktualizovat
Po vyzkoušení
scp -3 remote1:~/testSCP [email protected]:~/
Chovám se divně. I když je moje heslo správné, dává mi následující výstup:
[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:
Zatím jsem neaktivoval ověřování bez klíčů.
Nová aktualizace
Poté, co jsem to vyzkoušel několika způsoby, jsem to dokázal udělat ve svých skriptech tak, že jsem se přihlásil k remote1 přes ssh z mého localhost a poté scp ze remote1 do remote2. To však neodpovídá na mou otázku. Chtěl jsem to udělat přímo z místního počítače a poté přenést soubory mezi dvěma instancemi, což podle mého názoru není podporováno, pokud démony ssh dvou instancí používají jiný port, než je výchozí pro připojení ssh.
Komentáře
Odpovědět
To nemůžete udělat pomocí jednoduchého scp vzdáleného přístupu [1].
Místo toho ssh přejděte na 1. vzdáleného hostitele a odtud spusťte scp s argumentem portu:
ssh -p 2222 ruser1@rhost1 scp -P 2222 /rpath/1 ruser2@rhost2:/rpath/2
Pokud chcete dělat přesně to, co scp
dělá, můžete také přidat -n -x -oClearAllForwardings=yes
možnosti do ssh
, i když to obvykle není potřeba.
[1]: novější verze scp
podporují specifikaci uri (včetně portu) místo host:path
, ale pouze při použití možnosti -3
(„projít místním hostitelem“).
Pravděpodobně tedy můžete použít
scp -3 -P 2222 ruser1@rhost1:/rpath/1 scp://ruser2@rhost2:2222//rpath/2
(všimněte si, že /
po host[:port]
není součástí cesty – bude odkazovat na ./file
v domovském adresáři user
).
Ale kopírování přes localhost je pomalejší a podle mých zkušeností skryje chyby. Například se nevytiskne žádná chybová zpráva, přestože nelze vytvořit žádný /foo/bar/baz
soubor:
scp -3 localhost:.bashrc localhost:/foo/bar/baz
Do toho jsem se nedostal do žádné hloubky – prostě jsem se tomu vyhnul 😉
Pokud někoho toto všechno nepřesvědčí, může se podívat na zdrojový kód :
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"); }
Všimněte si, že proměnná tport
je nastavena pouze analýzou scp://
uri a ve verzích starších než 7.6p1 (říjen 2017) prostě neexistuje.
Komentáře
- Mohli byste vysvětlit, co
-x -oClearAllForwardings=yes
ve vaší odpovědi tato možnost dělá? Také jsem přemýšlel, jestli to lze provést pomocírsync
. -
-x
zakáže přeposílání X11 a-oClear..
zakáže všechna přesměrování tcp (pro případ, že by kterékoli z nich bylo vynuceno prostřednictvím~/.ssh/config
nebo/etc/ssh/ssh_config
) - @RakibFiha rsync říká: " Zdroj i cíl nemohou být vzdálené ". Možná jsou kolem toho triky, ale to by měla být samostatná otázka.
- Teď jsem si to po podrobném vysvětlení uvědomil. (y)
~/.ssh/config
Ve vzdálené 1 a vzdálené je výchozí port v ~ / .ssh / config nezměněn, takže jeho výchozí port 22. Mohu je upravit, ale já chtěl bych to udělat pomocí jednorázové linky, místo toho, abych pokaždé upravoval každou konfiguraci ssh.ssh
do jednoho ke vzdáleným hostitelům a odtud vydat jednoduchýscp
, nebo to udělat v jednom řádku s něčím jakossh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'
. Také nebudete ' muset upravovatconfig
soubory najednou: pouze jednou pro každý pár hostitelů (např. Nastavení portu pro připojení kremote2
naremote1
), ale samozřejmě vám to může být nepříjemné, v závislosti na počtu vašich hostitelů.