Terminalden Tek Hat sftp


91

Gün boyunca birkaç kez, uzaktaki bir sunucudaki bir günlük dosyasına bakmam gereken bir test çalıştırıyor olabilirim. sftpUzak sunucuya uçbirimimi kullanmaya ve istenen günlük dosyasını /tmpyerel makineme indirmeye alıştım .

Bugün man sftp, aşağıdaki komutları temelde tek bir satırda çalıştırmanın bir yolunu bulmaya çalışırken seçeneklere bakıyordum, böylece bir komut yazmak, enter tuşuna basmak, bir komut yazmak, enter tuşuna basın, vb.

(şimdi ne yapıyorum)

sftp myuser@myserver
--mypassword at prompt
lcd /tmp
get /dir/dir/dir/dir/file
quit

Daha önce kullanmadığım man sftpbir referansa bakarken buldum scp. Aradığım şeyin bu olabileceğini hissediyorum, ancak güvenli bir şekilde kopyalanan dosyanın nereye gitmesini istediğimi belirtmenin bir yolunu bulamadım.

Birisi bana /dir/fileuzaktaki bir sunucudan almanın ve indirmenin bir yolunu sağlayabilir /tmp/file_plus-my-descriptionmi?

Normal bir UNIX kopyasına benzer bir sftp veya scp komutunu çalıştırabilmeyi umuyordum.

scp myuser@myserver /dir/file /tmp/file_plus-my-description

TerminalMac OS X 10.8'de yerleşik kullanıyorum . Teşekkürler.

Yanıtlar:


201

Eylül 2017 Güncellemesi - tl; dr

Uzak bir ftp sunucusundan makinenize tek bir dosya indirin :

sftp {user}@{host}:{remoteFileName} {localFileName}

Makinenizden uzaktaki bir ftp sunucusuna tek bir dosya yükleyin :

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'

Orijinal cevap:

Tamam, bu yüzden biraz aptal hissediyorum. Ama anladım. Neredeyse zirveye düştüm:

sftp user@host remoteFile localFile

Terminalde gösterilen tek belge şudur:

sftp [user@]host[:file ...]
sftp [user@]host[:dir[/]]

Ancak, özetin altında aşağıdakileri gösteren bu siteye rastladım :

sftp [-vC1 ] [-b batchfile ] [-o ssh_option ] [-s subsystem | sftp_server ] [-B buffer_size ] [-F ssh_config ] [-P sftp_server path ] [-R num_requests ] [-S program ] host 
sftp [[user@]host[:file [file]]] 
sftp [[user@]host[:dir[/]]]

Yani basit cevap, :kullanıcı ve ana makinenizden sonra uzak dosya ve yerel dosya adından hemen sonra yapmanızdır . İnanılmaz derecede basit!

Tek satır, sftp kopyala uzak dosya:

sftp username@hostname:remoteFileName localFileName
sftp kyle@kylesserver:/tmp/myLogFile.log /tmp/fileNameToUseLocally.log

Şubat 2016 güncellemesi

Durumda herkes bunun tersini yapmak, yani komuta aradığı itmek tek satır bir uzak sunucuya yerel bilgisayarınızdan bir dosya sftp komutu, kullanıcı @Thariama aşağıda bunu başarmak için çözüm yayınlanmıştır. Ekstra kod için onlara şapka ipucu.

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'

20
tam tersini soruyordum (uzak sunucuya kopyala), ama kendim buldum: sftp {user} @ {host}: {dir} <<< $ 'put {path to file}'
Thariama

2
Özür dilerim, yanlış anlaşıldı. İleride birine yardımcı olma ihtimaline karşı cevabınızı cevaba kopyalayacağım. Teşekkürler @Thariama
Kyle

1
Bizim için TL: DR-türleri, ilk vurgulanan satır olarak yanlış çözüme sahip olmak biraz kafa karıştırıcı :-)
17:21 atlayın

1
@Kyle, çok daha iyi!
Eyl'17

1
Sftp'nin tek bir komutla dosya yükleme seçeneği içermemesini tuhaf buluyorum. Bu gayet iyi çalışıyor, ancak bu kadar basit bir işlem için çok zor. Hâlâ kutudan çıktığı gibi işe yarayan bulabildiğim tek şey, bu yüzden teşekkürler. :)
Teekin

7

Tek bir dosya YÜKLEMEK için, bir bash betiği oluşturmanız gerekecektir. Aşağıdaki gibi bir şey, sshpassyüklediyseniz OS X üzerinde çalışmalıdır .

Kullanım:

sftpx <password> <user@hostname> <localfile> <remotefile>

Bu komut dosyasını yolunuzda bir yere koyun ve adlandırın sftpx:

#!/bin/bash

export RND=`cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32`
export TMPDIR=/tmp/$RND
export FILENAME=$(basename "$4")
export DSTDIR=$(dirname "$4")

mkdir $TMPDIR
cp "$3" $TMPDIR/$FILENAME

export SSHPASS=$1
sshpass -e sftp -oBatchMode=no -b - $2 << !
   lcd $TMPDIR
   cd $DSTDIR
   put $FILENAME
   bye
!

rm $TMPDIR/$FILENAME
rmdir $TMPDIR

Cevap için teşekkürler, ancak yukarıda belirttiğim cevap, uzak bir sunucudan bir dosya almak ve dosyayı yerel makinenizde belirli bir konuma kaydetmek için sftp ile tek satır komutunu kullanacak. OS X'de yalnızca sftp ile çalışacağını doğruladım.
Kyle

2
Evet, bu kesinlikle uzaktan yerele aktarım için en iyi cevaptır. Ancak bunun tersini yapmak için bir çözüm eklemeyi düşündüm: yerelden uzaklığa. Herhangi birine yardımcı olması durumunda. Teşekkürler!
2014

3

sftp, toplu iş dosyalarını destekler.

Man sayfasından:

-b batchfile

Batch mode reads a series of commands from an input batchfile instead of stdin.  
Since it lacks user interaction it should be used in conjunction with non-interactive
authentication.  A batchfile of `-' may be used to indicate standard input.  sftp 
will abort if any of the following commands fail: get, put, rename, ln, rm, mkdir, 
chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink, and lmkdir.  Termination 
on error can be suppressed on a command by command basis by prefixing the command 
with a `-' character (for example, -rm /tmp/blah*).

Bu, farklı yerlerdeki farklı dosyalar için günde birkaç kez yaptığım bir işlem olduğundan, terminalimde (her zaman açık olan) tek bir satıra yazabileceğim bir komutu ezberleyebilmek ve enter tuşuna basmak güzel olurdu. Kullanmak --batch, komutlarımı bir dosyaya koymamı ve ardından o dosyayı bir param olarak iletmemi gerektirir. Hala oynuyorum scp, çözümümü içerebileceğini hissediyorum.
Kyle

Belki 'beklemek' aradığınız şeydir. linuxjournal.com/article/3065
synthesizerpatel

3

Ya da echo 'put {path to file}' | sftp {user}@{host}:{dir}hem unix hem de powershell'de çalışacak.


Bu sözdizimi ayrıca puttyftp (psftp) ile de çalışır. Buraya gelmemin nedeni bu olduğu için paylaşacağımı düşündüm
9 Guy

1

Aşağıdaki gibi küçük bir değişiklik, onu perl ve system () çağrısı içinden kullanırken benim için çalıştı:

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'

1

SCP cevabı

OP, SCP'den bahsetti, işte o.

Diğerlerinin de belirttiği gibi, yükleme sözdizimi indirme sözdiziminden tamamen farklı olduğu için SFTP kafa karıştırıcıdır . Bu alır marjinal aynı formu kullanarak eğer hatırlamak daha kolay:

echo 'put LOCALPATH REMOTEPATH' | sftp USER@HOST
echo 'get REMOTEPATH LOCALPATH' | sftp USER@HOST

Gerçekte, bu hala bir karmaşa ve insanların hala SCP gibi "modası geçmiş" komutları kullanmalarının nedeni bu:

scp USER@HOST:REMOTEPATH LOCALPATH
scp LOCALPATH USER@HOST:REMOTEPATH

SCP güvenli ancak tarihli. Asla düzeltilemeyecek bazı hatalar var, yani sunucu .bash_profilebir mesaj verirse çöküyor . Bununla birlikte, kullanılabilirlik açısından geliştiriciler yıllar öndeydi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.