Jak určit port pro scp pro vzdálený server?

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

  • stackoverflow.com/questions/10341032/… může vám pomoci
  • Zkoušel jsem ty, jak jsem uvedl v mé otázce. Nezdálo se, že by pro mě fungoval
  • localhost poslouchající port 22, ale v ssh config je specifický pro oba remote1 to remote2 na port 2222. Ano, myslel jsem ~/.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.
  • Dobře. Navrhuji upravit vaši otázku, ' dodává, že můžete, ale ' nejste ochotni upravit své soubory. Potom můžete ssh do jednoho ke vzdáleným hostitelům a odtud vydat jednoduchý scp, nebo to udělat v jednom řádku s něčím jako ssh -t -p <remote1 port> user1@remote1 'scp -P <remote2 port> user2@remote2:/source/path /dest/path'. Také nebudete ' muset upravovat config soubory najednou: pouze jednou pro každý pár hostitelů (např. Nastavení portu pro připojení k remote2 na remote1), ale samozřejmě vám to může být nepříjemné, v závislosti na počtu vašich hostitelů.
  • Ano, to odpovídá na vaši otázku. " Ne " není odpověď a je odpověď , ať už se vám to líbí nebo ne.

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)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *