Mám nějaké potíže s nahráváním adresářů (které obsahují jiné adresáře několik úrovní hluboko) pomocí sftp. Uvědomuji si, že bych to mohl vyřešit gzipováním, ale nechápu, proč je to nutné.
Každopádně to zkusím
sftp> put bin/
Uploading bin/ to /home/earlz/blah/bin
bin/ is not a regular file
sftp> put -r bin/
Uploading bin/ to /home/earlz/blah/bin
Couldn't canonicalise: No such file or directory
Unable to canonicalise path "/home/earlz/blah/bin"
Myslím, že poslední chybová zpráva je úplně hloupá. Takže adresář neexistuje? Proč nevytvářet adresář?
Existuje přesto tento problém s sftp, nebo bych měl použít scp?
OPRAVENO : Původně jsem tvrdil, že OpenSSH nepodporuje put -r
. To ano, ale dělá to velmi zvláštním způsobem. Zdá se, že cílový adresář již existuje, se stejným názvem jako zdrojový adresář.
sftp> put -r source
Uploading source/ to /home/myself/source
Couldn't canonicalize: No such file or directory
etc.
sftp> mkdir source
sftp> put -r source
Uploading source/ to /home/myself/source
Entering source/
source/file1
source/file2
Zvláště zvláštní je, že to platí i v případě, že k cíli zadáte jiné jméno:
sftp> put -r source dest
Uploading source/ to /home/myself/dest
Couldn't canonicalize: ...
sftp> mkdir dest
sftp> put -r source dest
Uploading source/ to /home/myself/dest/source
Couldn't canonicalize: ...
sftp> mkdir dest/source
sftp> put -r source dest
Uploading source/ to /home/myself/dest/source
Entering source/
source/file1
source/file2
Pro lépe implementovaný rekurzivní put
můžete místo toho použít nástroj příkazového řádku PuTTY psftp
. To je v PuTTY-tools
balíček pod Debianem (a pravděpodobně Ubuntu).
Filezilla také udělá, co chcete, pokud chcete použít GUI.
Nevím, proč to sftp dělá, ale můžete rekurzivní kopii pouze v případě, že cílový adresář již existuje. Tak to udělejte ...
sftp> mkdir bin
sftp> put -r bin
Možná vás bude zajímat použití rsync
. Příkaz by to byl
rsync --delete --rsh=ssh -av bin/ remote-ip-or-fqdn:/home/earlz/blah/bin/
Toto zkopíruje vše v bin/
a umístěte jej na vzdálený server do /home/earlz/blah/bin/
. Další výhodou je, že nejprve zkontroluje, zda se soubor na vzdálené straně nezměnil, a pokud tomu tak není, nebude jej znovu odesílat. Navíc můžete přidat volbu -z a zkomprimuje ji za vás.
lcd
: vaše místní složka (s podsložkami)
cd
: vaše vzdálená složka
put -r .
Mohu navrhnout poněkud komplikovanou odpověď, bez zipu, ale včetně dehtu?
Tady jsme:
tar -cf - ./bin | ssh target.org " ( cd /home/earlz/blah ; tar -xf - ) "
Tím se zabalí adresář ./bin s tarem (-cf: = create file), filename - (none, stdout) a zavede jej příkazem ssh na target.org (což může být i IP), kde příkaz v uvozovkách se provádí: cd k bla, a tar -xf (extrahovat soubor) - žádný, žádné jméno, jen stdin.
Je to, jako kdybyste balíček zabalili doma, přivezli jej na poštu, pak odjeli do práce, kde očekáváte balíček a otevřeli jej.
Možná existuje mnohem elegantnější řešení, které používá pouze sftp.
Můžete použít yafc (Přesto FTP/SFTP klienta anoter). The -r
volba tam funguje velmi dobře.
Můžete použít rsync , což je velmi výkonná alternativa pro scp a sftp, zejména při aktualizaci kopií ze stroje A na stroj B, protože to není ' • zkopírovat soubory, které nebyly změněny; je také schopen odstranit soubory ze stroje B, které byly odstraněny ze stroje A (pouze pokud je to samozřejmě řečeno).
například :
rsync -zrp /home/a/ [email protected]:/home/b/
Možnost -r je určena pro rekurzivní kopírování souborů, -z umožňuje kompresi během přenosu a -p zachovává při kopírování oprávnění k souborům (vytváření souborů, úpravy atd.), Což scp nedělá AFAIK. Existuje mnoho dalších možností; jako obvykle si přečtěte manuálové stránky.
Původní odpověď Karolose
Přihlaste se ke vzdálenému serveru pomocí ssh, pomocí sftp se připojte zpět do vaší schránky a poté použijte get -r
příkaz k přenosu adresářů na vzdálený server. Příkaz get vám umožňuje převádět adresáře rekurzivně, aniž by byl již vytvořen adresář.
ssh remote ip
sftp local ip
get -r whichever-dir
Případ SFTP:
Potřeboval jsem zkopírovat tuto strukturu na můj ftp:
mainfolder --- folder --- subfolder
| |
file1.txt file2.txt
To vyřešilo můj problém:
cd ./mainfolder
mkdir folder
put -r /from/source/folder/* /mainfolder/folder/
cd ./folder
mkdir subfolder
put -r /from/source/folder/subfolder/* /mainfolder/folder/subfolder/
Právě jsem se z Arch Linux Wiki dozvěděl, že je možné připojit sftp-share pomocí sshfs. Používám sftp server s chrootem a vězení a sshfs fungují velmi dobře.
sshfs <sftpuser>@<server>:<read/writable/directory> <your/local/mount/directory>
fusermount -u <your/local/mount/directory>