Důležitá poznámka:Stroj, kterému říkáte „místní stroj“, je zcela irelevantní. Skutečný příběh začíná, když už jste na 100.100.100.1
. V kontextu scp
a v kontextu této odpovědi je "místní" stroj, kde je scp
je vámi vyvoláno.
Proč selže první [příkaz]?
Pokusili jste se kopírovat mezi dvěma (formálně) vzdálenými hostiteli. scp
rozpozná [email protected]:/path/1/
jako nemístní cestu. Nezáleží na tom [email protected]
ukazuje na místní stroj. Nástroj nekontroluje (a neměl by) kontrolovat, zda adresa, která vypadá jako vzdálená, odkazuje na místní počítač. Pouhým odkazem na zdroj, jako by byl vzdálený, jste vytvořili scp
zacházet s ním jako se vzdáleným přístupem. Také cíl byl vzdálený.
Kopírování mezi dvěma vzdálenými hostiteli lze provést s nebo bez -3
možnost:
-3
Kopie mezi dvěma vzdálenými hostiteli jsou přenášeny prostřednictvím místního hostitele. Bez této možnosti se data kopírují přímo mezi dvěma vzdálenými hostiteli. […]
Tučný fragment se vztahuje na váš případ (i když vaše scp
nepodporuje -3
).
Pokud používáte -v
s vaším prvním příkazem
scp -v -i ~/keyfile -r [email protected]:/path/1/ [email protected]:/path/2/
uvidíte scp
připojí se z místního hostitele ke zdrojovému hostiteli ("náhodou" je to stejný hostitel) pomocí klíče zadaného pomocí -i
. (Zřejmě je hostitel nakonfigurován tak, aby tento klíč akceptoval, pravděpodobně proto, že druhý server používá k připojení identický klíč.)
Poté uvidíte další scp
je vyvolán na zdrojovém hostiteli. Příkaz je:
scp -v -r /path/1/ [email protected]:/path/2/
-v
a -r
jsou tam, protože byli ve vašem místním velení. Zdrojová cesta je přeložena na místní cestu; cíl se nemění. Pokud tento příkaz proběhne úspěšně, data budou „zkopírována přímo mezi dvěma vzdálenými hostiteli“.
Všimněte si, že neexistuje žádný -i
. Mělo by -i ~/keyfile
buď tam? Nebo spíše -i /home/cindy/keyfile
nebo tak? (protože místní scp
dostal něco takového poté, co místní shell rozšířil vlnovku).
Ne. Vzdálený zdrojový hostitel může být (a obvykle je) jiný než lokální hostitel. Cesta, která je platná pro místního hostitele, může ukazovat na cokoli nebo nic na vzdáleném hostiteli. Pokud scp
na zdrojovém hostiteli bylo vyvoláno -i
způsobilo by to více problémů, než by to mohlo vyřešit. Je to dobrá věc -i
se nerozšíří na příkaz vyvolaný na zdrojovém hostiteli. Ale pak se hostitel připojí k cíli pomocí svého výchozího klíče nebo čehokoli, co mu jeho konfigurace přikáže použít.
Ve vašem případě to vypadá, že potřebujete místní ~/keyfile
pro připojení k cílovému hostiteli. Zdrojový hostitel obsahuje správný soubor (protože v tomto konkrétním případě je místní a zdrojový počítač stejný počítač), ale scp
příkaz, který se skutečně připojuje k cíli, postrádá -i
(jak by obecně mělo) a proto se klíč nepoužívá.
Váš druhý příkaz používal jako zdroj místní cestu, pouze cíl byl vzdálený. V tomto případě klíč určený pomocí -i
byl použit k připojení od místního hostitele k cílovému hostiteli, přesně tak, jak jste plánovali. Proto to fungovalo.
Všimněte si, zda jste nakonfigurovali místní počítač tak, aby automaticky používal ~/keyfile
pro připojení k druhému serveru (IdentityFile
v ~/.ssh/config
), pak by fungoval první příkaz. Místní hostitel by se zbytečně připojoval sám k sobě, jen aby si řekl, aby se připojil k cíli, ale přesto by to fungovalo. První připojení by použilo ~/keyfile
kvůli -i
, druhé připojení by použilo ~/keyfile
kvůli konfiguraci.
Z příručky scp, popis volby -3:Kopie mezi dvěma vzdálenými hostiteli jsou přenášeny prostřednictvím místního hostitele. Bez této možnosti jsou data kopírována přímo mezi dvěma vzdálenými hostiteli. Všimněte si, že tato možnost deaktivuje měřič průběhu a vybere dávkový režim pro druhého hostitele, protože scp nemůže žádat o hesla nebo přístupové fráze pro oba hostitele.
Podle popisu nejprve selže, protože 2 vzdálené servery budou komunikovat přímo (ve skutečnosti bude server 100.100.100.1 komunikovat se serverem 100.100.100.2 přes ssh), takže máte možnosti:
- Použijte možnost -3.
- Nakonfigurujte 2 vzdálené servery, aby se mohly autentizovat pomocí klíče ssh souboru klíčů. Pokud se můžete přihlásit od serveru 100.100.100.1 do 100.100.100.2 pomocí klíče ssh, váš původní příkaz bude fungovat.