Single Line sftp dari Terminal

91

Beberapa kali sepanjang hari, saya mungkin menjalankan tes di mana saya perlu melihat file log di server jauh. Saya sudah terbiasa menggunakan terminal saya untuk sftpmasuk ke server jarak jauh dan menarik file log yang diinginkan ke /tmpmesin lokal saya.

Saya melihat-lihat opsi hari ini menggunakan man sftpdalam upaya untuk mencari cara untuk menjalankan perintah berikut pada dasarnya dalam satu baris sehingga saya tidak perlu mengetikkan perintah, tekan enter, ketik perintah tekan enter, dll.

(apa yang saya lakukan sekarang)

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

Saya menemukan sambil melihat-lihat man sftpreferensi scpyang belum pernah saya gunakan sebelumnya. Saya merasa itu mungkin yang saya cari, tetapi saya tidak melihat cara untuk menentukan ke mana saya ingin file yang disalin dengan aman itu pergi.

Bisakah seseorang memberi saya cara untuk mendapatkan /dir/filedari server jarak jauh dan mengunduhnya /tmp/file_plus-my-description?

Saya berharap dapat menjalankan perintah sftp atau scp yang mirip dengan salinan UNIX biasa seperti:

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

Saya menggunakan bawaan Terminaldi Mac OS X 10.8. Terima kasih.

Kyle
sumber

Jawaban:

201

Perbarui Sep 2017 - tl; dr

Unduh satu file dari server ftp jarak jauh ke mesin Anda:

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

Unggah satu file dari mesin Anda ke server ftp jarak jauh:

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

Jawaban asli:

Oke, jadi saya merasa sedikit bodoh. Tapi saya menemukan jawabannya. Saya hampir mendapatkannya di atas dengan:

sftp user@host remoteFile localFile

Dokumentasi satu-satunya yang ditampilkan di terminal adalah ini:

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

Namun, saya menemukan situs ini yang menunjukkan yang berikut di bawah sinopsis:

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[/]]]

Jadi jawaban sederhananya adalah Anda hanya melakukan :setelah pengguna dan host Anda kemudian file jarak jauh dan nama file lokal. Sangat sederhana!

Baris tunggal, file jarak jauh sftp copy:

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

Perbarui Feb 2016

Jika ada yang mencari perintah untuk melakukan kebalikannya dan mendorong file dari komputer lokal Anda ke server jarak jauh dalam satu sftp perintah baris tunggal , pengguna @Thariama di bawah ini memposting solusi untuk mencapai itu. Berikan tip kepada mereka untuk kode ekstra.

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
Kyle
sumber
20
saya bertanya sebaliknya (salin ke server jarak jauh), tetapi saya menemukannya sendiri: sftp {user} @ {host}: {dir} <<< $ 'put {path to file}'
Thariama
2
Maafkan saya, salah paham. Saya akan menyalin tanggapan Anda ke dalam jawaban seandainya dapat membantu seseorang di masa depan. Terima kasih @Thariama
Kyle
1
Bagi kami TL: DR -types, agak membingungkan untuk memiliki solusi yang salah seperti baris pertama yang disorot :-)
skoll
1
@, Jauh lebih baik!
skoll
1
Saya merasa aneh bahwa sftp tidak menyertakan opsi untuk mengunggah file dalam satu perintah. Ini berfungsi dengan baik, tetapi terlalu hack untuk operasi sederhana seperti itu. Itu masih satu-satunya hal yang dapat saya temukan yang benar-benar berfungsi di luar kotak, jadi terima kasih. :)
Teekin
7

Untuk MENGUNGGAH satu file, Anda perlu membuat skrip bash. Sesuatu seperti berikut seharusnya berfungsi di OS X jika Anda telah sshpassmenginstal.

Pemakaian:

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

Letakkan skrip ini di suatu tempat di jalur Anda dan beri nama 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
sstur
sumber
Terima kasih atas jawabannya, namun, jawaban yang saya sebutkan di atas akan menggunakan perintah baris tunggal dengan sftp untuk mendapatkan file dari server jarak jauh dan menyimpan file ke lokasi tertentu di mesin lokal Anda. Saya telah memverifikasi bahwa itu akan berfungsi di OS X hanya dengan sftp.
Kyle
2
Ya, itu pasti jawaban terbaik untuk mentransfer dari jarak jauh ke lokal. Namun saya pikir saya akan menambahkan solusi untuk melakukan yang sebaliknya: lokal ke jarak jauh. Untuk berjaga-jaga jika itu membantu siapa pun. Terima kasih!
sstur
3

sftp mendukung file batch.

Dari halaman manual:

-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*).
synthesizerpatel
sumber
Karena ini adalah proses yang saya lakukan beberapa kali sehari untuk file yang berbeda di tempat yang berbeda, alangkah baiknya jika hanya menghafal perintah yang dapat saya ketik menjadi satu baris di terminal saya (yang selalu terbuka) dan tekan enter. Menggunakan --batchakan mengharuskan saya untuk memasukkan perintah saya ke dalam file kemudian meneruskan file itu sebagai param. Saya masih bermain-main scp, saya merasa mungkin berisi solusi saya.
Kyle
Mungkin 'harapan' adalah yang Anda cari saat itu. linuxjournal.com/article/3065
synthesizerpatel
3

Atau echo 'put {path to file}' | sftp {user}@{host}:{dir}, yang akan bekerja di unix dan PowerShell.

js2010
sumber
Sintaks ini juga berfungsi dengan puttyftp (psftp). Hanya berpikir saya akan berbagi karena itulah alasan saya berakhir di sini
9 Guy
1

Modifikasi kecil seperti di bawah ini berhasil untuk saya saat menggunakannya dari dalam perl dan system () call:

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

Jawaban SCP

OP menyebutkan SCP, jadi begini.

Seperti yang ditunjukkan orang lain, SFTP membingungkan karena sintaks unggahan sama sekali berbeda dari sintaks unduhan . Ia mendapat sedikit lebih mudah untuk diingat jika Anda menggunakan bentuk yang sama:

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

Pada kenyataannya, ini masih berantakan, dan itulah mengapa orang masih menggunakan perintah "usang" seperti SCP:

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

SCP aman tetapi tertanggal. Ada beberapa bug yang tidak akan pernah bisa diperbaiki, yaitu crash jika server .bash_profilemengeluarkan pesan. Namun, dalam hal kegunaan, pengembang sudah bertahun-tahun di depan.

cz
sumber