Pratik Araçlar: LFTP
SFTP ve SCP Kullanımı başlıklı yazıda nasıl güvenli bir şekilde dosya transfer işlemleri gerçekleştirebileceğimize değinmiş ve çeşitli örnekler paylaşmıştım.
İlgili yazının devamı olarak, daha sofistike ihtiyaçlar doğrultusunda tercih edilebilecek, Unix-like sistemlerde pratik bir şekilde kullanılabilecek bir başka alternatif komut satırı programındanistemciden bahsetmek istiyorum. Programın adı LFTP. Peki, LFTP tam olarak nedir ve ne tür ihtiyaçlar doğrultusunda tercih edilebilir?
LFTP
LFTP, Alexander Lukyanov tarafından Unix benzeri işletim sistemleri için tasarlanmış, çeşitli dosya aktarım/erişim protokolleri kullanmayı mümkün kılan, komut satırı (command-line) aracılığıyla kullanılabilen gelişmiş bir dosya transfer programıdır1. Bu protokoller; FTP, FTPS, HTTP, HTTPS, HFTP, FISH, SFTP dışında GNU TLS veya OpenSSL kitaplığı ile derlendiğinde HTTPS ve FTPS de kullanılabilir2. GNU Genel Kamu Lisansı’na sahip program ile ilgili detaylara Desc3 ve özelliklere Features4 sayfaları üzerinden ulaşılabilir.
LFTP’deki her işlem kontrollü bir şekilde yürütülür ve kritik olmayan bir hata söz konusu olduğunda işlem yeniden ele alınır. Böylece, indirme sürecinde olası bir kopma ve benzeri durum oluşmuşsa ilgili noktadan otomatik olarak yeniden başlatılır. FTP sunucusu REST desteklemese bile, LFTP dosyayı en başından dosya tamamen aktarılıncaya kadar almaya çalışacaktır.
Tüm işler bitmeden önce LFTP’den çıkarsanız, LFTP arka planda nohup (No Hangups) moduna geçer. Aynı şey gerçek bir modem kapatmasıyla veya bir xterm kapattığınızda da olur5.
LFTP bilgisayarınızda mevcut değilse homebrew gibi bir paket yöneticisi aracılığıyla hızlıca indirebilirsiniz.
brew install lftp
LFTP Kullanımı
LFTP ile ilgili kullanım bilgilerine komut satırı arayüzü üzerinden, lftp --help
komutu ile ulaşabiliriz6. Komutu girmemizin ardından alacağımız dönüş şu şekilde özetlenebilir:
lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site]
lftp -f script_dosyasi
lftp -c komutlar
lftp --version
lftp --help
Temel bir şekilde kullanım örneklerine bakalım.
Çok daha detaylı bilgi için programın manuel5 sayfasına göz atabilirsiniz. Örnek bağlantı işlemlerine geçelim. Bu süreçte digitalocean altında oluşturduğum bir droplet üzerinden hem ftp hem de sftp işlemleri gerçekleştireceğim. Öncelikle temel bir bağlantıyı nasıl oluşturabileceğimize bakalım7.
lftp <alanadi-veya-ip-adresi>
Yukarıdaki komutu uyguladığınızda lftp
kabuğuna erişirsiniz. Daha bağlantı sağlanmamıştır. Kabuk içerisinde herhangi bir komut uygulayabilirsiniz. Örneğin, ls
komutunu girmenizin ardından `ls' at 0 [Connecting...]
dönüşünü alırsınız. Bir kullanıcı adı ve şifresi üzerinden de erişim sağlayabilirsiniz.
lftp -u <kullanici-adi>,<sifre> <alanadi-veya-ip-adresi>
# ya da
lftp -u <kullanici-adi> -p <sifre> <alanadi-veya-ip-adresi>
Alan adı veya IP adresini belirtirken protokol/port tanımı da yapabilirsiniz. Örneğin, bir güvenli bağlantı oluşturmak isteyelim:
lftp -u <kullanici-adi> -p <sifre> <alanadi-veya-ip-adresi>:22
Bu komutu uygulamanızın ardından Connecting...
bildiriminin hemen ardından `ls' at 0 [FEAT negotiation...]
bildirimi görüntülenecektir.
Yukarıdaki bağlantı isteklerinde sunucudan cevap alınamayabilir. Bu gibi durumlarda Ctrl+C
ile isteği durdurabilir, exit
veya bye
ile kabuktan çıkış yapabiliriz. Şayet böyle bir durumla karşılaşmışsanız ilgili işlemi ftp://
veya sftp://
gibi protokolü doğrudan belirterek yineleyebilirsiniz.
İşlemleri biraz daha geliştirelim ve debug modunu açıp ls
komutunun bağlantı sağlanır sağlanmaz uygulanmasını isteyelim.
lftp -d -e "ls /var/www/html" sftp://<kullanici-adi>@<alanadi-veya-ip-adresi>
Komutun uygulanmasının ardından şu dönüşü alırım.
Peki, yukarıdaki işlemleri başka nasıl uygulayabilirim? Evet, LFTP bize pek çok alternatif kullanım sunmakta. Son örneğimizi yeniden ele alalım.
lftp -d
open sftp://<kullanici-adi>@<alanadi-veya-ip-adresi>
ls /var/www/html
#ya da
lftp -d -u <kullanici-adi>,<sifre> -e open sftp://<alanadi-veya-ip-adresi>
ls /var/www/html
Bu adımların sonucunda da aynı sonuca ulaşırız. Elbette işlemleri daha da çeşitlendirmek mümkün6. Fakat, bağlantı sürecini başarıyla tamamladığımızı varsayarak daha farklı işlemlere geçebiliriz. Öncelikle belirtmekte fayda var; !
ile kabuk komutu uygulayabiliriz. Şöyle ki, LFTP kabuğu içerisindeyken ! ls
komutunu uygularsanız yerel ana bilgisayarınızdaki dizin içeriğini listelersiniz. Bu bilgiyi aklımızın bir kölesinde tutalım. Bir sonraki adımda başarıyla sağlanmış bir bağlantı içeriğindeyken farklı bir uzak sunucuya erişelim.
lftp -d sftp://<kullanici-adi>@<alanadi-veya-ip-adresi>
open ftp.freebsd.org -e "ls -li"
Şimdi de yerel ana bilgisayardan dosya edinme ve gönderme işlemlerine bakalım. Bu işlemlerde mget
ve mput
komutlarından faydalanacağız.
lftp -d sftp://<kullanici-adi>@<alanadi-veya-ip-adresi>
mget <uzak-sunucudan-indirilecek-dosya-adi>
mput <uzak-sunucuya-gonderilecek-dosya-adi>
Unutmadan, bağlantı ve dosya edinme işlemini torrent BitTorrent protokolü için de gerçekleştirmek mümkün7.
lftp -d
torrent --dht-bootstrap=router.utorrent.com
torrent "http://linuxtracker.org/download.php?id=7d7ccab78c13c722907e760e99bcb77cca00078b&f=Zorin-OS-12-Core-64.iso.torrent&key=6c2d037a"
Şahane, değil mi? Şimdi gelelim LFTP ile uzak ftp hesabına nasıl yedekleme yapacağımıza. Bu işlemi de yine pek çok biçimde gerçekleştirmek mümkün. Öncelik olarak daha basit ve anlaşılır bir yol olan konfigürasyon tanımıyla başlayalım. Dosyamızın adı backup.conf
olsun ve içeriğini şu şekilde tanımlayalım.
open -u <kullanici-adi> -p <sifre> sftp://<alanadi-veya-ip-adresi>/<dizin-adi>
mput <uzak-sunucuya-gonderilecek-dosya-adi>
bye
Şimdi bu konfigürasyon dosyasını işleme alacak islem.sh
adında bir shell script hazırlayalım ve içeriğini şu şekilde tanımlayalım.
#!/bin/sh
lftp -f backup.conf
Neredeyse işlemimiz tamam. ./islem.sh
dosyasını doğrudan çalıştırmak istersek permission denied: ./islem.sh
şeklinde bir dönüş alabiliriz. Bu durumda dosyaya chmod
ile execution yetkisi vermemiz gerekir.
chmod +x ./islem.sh
Şimdi tekrar shell script’i işleme alalım.
./islem.sh
Script’i çalıştırmamızın ardından konfigürasyon dosyası içerisinde open
ile belirttiğimiz uzak yol bağlantısı sağlanacak, yerel ana bilgisayarımızdaki ilgili dosya uzak sunucuda belirtilen dizine kopyalanacak ve hemen ardından bye
ile bağlantı sonlandırılacaktır. Shell script’in belirli zamanlarda uygulanmasını isterseniz crontab ile bir cronjob tanımlayabilirsiniz. Elbette bu kadar basit bir işlem için dosyalarla uğraşmak istemeyebilirsiniz.
lftp -e "mput <uzak-sunucuya-gonderilecek-dosya-adi>; bye" -u <kullanici-adi> -p <sifre> sftp://<alanadi-veya-ip-adresi>/<dizin-adi>
Son örnekte daha işlevsel bir komut uygulayalım ve uzak sunucudaki bir dizinin birebir kopyasını yerel ana bilgisayarımıza indirelim.
lftp -c 'open -u root sftp://<alanadi-veya-ip-adresi>; mirror -c -e /<uzak-sunucudan-indirilecek-dizin-adi>'
Yine bu işlemi shell script ile komut dosyası halinde uygulayabilir ve cronjob ile zamana bağlı olarak işleme alabiliriz.