บรรทัดเดียว sftp จาก Terminal


92

หลายครั้งตลอดทั้งวันฉันอาจจะทำการทดสอบที่ฉันต้องตรวจสอบไฟล์บันทึกบนเซิร์ฟเวอร์ระยะไกล ฉันคุ้นเคยกับการใช้เทอร์มินัลของฉันเพื่อsftpเข้าสู่เซิร์ฟเวอร์ระยะไกลและดึงไฟล์บันทึกที่ต้องการลง/tmpบนเครื่องภายในของฉัน

วันนี้ฉันกำลังมองหาตัวเลือกต่างๆโดยใช้man sftpเพื่อพยายามหาวิธีเรียกใช้คำสั่งต่อไปนี้โดยทั่วไปในบรรทัดเดียวเพื่อที่ฉันจะได้ไม่ต้องพิมพ์คำสั่งกด Enter พิมพ์คำสั่งกด Enter ฯลฯ

(ตอนนี้ฉันทำอะไร)

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

ฉันพบในขณะที่ดูman sftpข้อมูลอ้างอิงscpที่ฉันไม่เคยใช้มาก่อน ฉันรู้สึกว่ามันอาจจะเป็นสิ่งที่ฉันกำลังมองหา แต่ฉันไม่เห็นวิธีระบุว่าฉันต้องการให้ไฟล์ที่คัดลอกอย่างปลอดภัยไปที่ใด

มีใครช่วยหาวิธีรับ/dir/fileจากเซิร์ฟเวอร์ระยะไกลและดาวน์โหลดไปยังได้/tmp/file_plus-my-descriptionไหม

ฉันหวังว่าจะสามารถรันคำสั่ง sftp หรือ scp ที่คล้ายกับสำเนา UNIX ทั่วไปเช่น:

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

ฉันใช้TerminalMac OS X 10.8 ในตัว ขอบคุณ.

คำตอบ:


204

อัปเดตกันยายน 2017 - tl; dr

ดาวน์โหลดไฟล์เดียวจากเซิร์ฟเวอร์ ftp ระยะไกลไปยังเครื่องของคุณ:

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

อัปโหลดไฟล์เดียวจากเครื่องของคุณไปยังเซิร์ฟเวอร์ ftp ระยะไกล:

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

คำตอบเดิม:

โอเคฉันรู้สึกโง่เล็กน้อย แต่ฉันคิดออกแล้ว ฉันเกือบจะอยู่ด้านบนด้วย:

sftp user@host remoteFile localFile

เอกสารเดียวที่แสดงในเทอร์มินัลคือ:

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

อย่างไรก็ตามฉันเจอไซต์นี้ซึ่งแสดงสิ่งต่อไปนี้ภายใต้บทสรุป:

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

ดังนั้นคำตอบง่ายๆคือคุณทำ:หลังจากผู้ใช้และโฮสต์ของคุณจากนั้นไฟล์ระยะไกลและชื่อไฟล์ในเครื่อง ง่ายเหลือเชื่อ!

บรรทัดเดียว, sftp คัดลอกไฟล์ระยะไกล:

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

อัปเดต ก.พ. 2559

ในกรณีที่ใครก็ตามกำลังมองหาคำสั่งเพื่อทำสิ่งนี้ย้อนกลับและพุชไฟล์จากคอมพิวเตอร์ในระบบของคุณไปยังเซิร์ฟเวอร์ระยะไกลในsftp คำสั่งบรรทัดเดียวผู้ใช้ @Thariama ด้านล่างโพสต์วิธีแก้ปัญหาเพื่อให้บรรลุเป้าหมายนั้น ปลายหมวกสำหรับพวกเขาสำหรับรหัสพิเศษ

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

20
ฉันกำลังถามวิธีอื่น ๆ (คัดลอกไปยังเซิร์ฟเวอร์ระยะไกล) แต่ฉันพบด้วยตัวเอง: sftp {user} @ {host}: {dir} <<< $ 'put {path to file}'
Thariama

2
ขอโทษที่เข้าใจผิด ฉันจะคัดลอกคำตอบของคุณไปเป็นคำตอบเผื่อว่าจะสามารถช่วยเหลือใครบางคนได้ในอนาคต ขอบคุณ @Thariama
Kyle

1
สำหรับเรา TL: DR -types มันค่อนข้างสับสนเล็กน้อยที่มีวิธีแก้ปัญหาที่ไม่ถูกต้องเป็นแถวแรกที่ไฮไลต์ :-)
skoll

1
@ ไคล์ดีกว่าเยอะ!
skoll

1
ฉันคิดว่ามันแปลกที่ sftp ไม่มีตัวเลือกสำหรับการอัปโหลดไฟล์ในคำสั่งเดียว วิธีนี้ใช้งานได้ดี แต่มันแฮ็คเกินไปสำหรับการใช้งานที่เรียบง่ายเช่นนี้ ยังคงเป็นสิ่งเดียวที่ฉันพบว่าใช้งานได้จริงนอกกรอบขอบคุณมาก :)
Teekin

7

ในการอัปโหลดไฟล์เดียวคุณจะต้องสร้างสคริปต์ทุบตี สิ่งต่อไปนี้ควรใช้ได้กับ OS X หากคุณsshpassติดตั้ง

การใช้งาน:

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

วางสคริปต์นี้ไว้ที่ไหนสักแห่งในเส้นทางของคุณและเรียกมันว่า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

อย่างไรก็ตามขอขอบคุณสำหรับการตอบกลับคำตอบที่ฉันระบุไว้ข้างต้นจะใช้คำสั่งบรรทัดเดียวกับ sftp เพื่อรับไฟล์จากเซิร์ฟเวอร์ระยะไกลและบันทึกไฟล์ไปยังตำแหน่งเฉพาะบนเครื่องท้องถิ่นของคุณ ฉันได้ตรวจสอบแล้วว่าจะทำงานบน OS X ที่มีเฉพาะ sftp
Kyle

2
ใช่นั่นเป็นคำตอบที่ดีที่สุดสำหรับการถ่ายโอนจากระยะไกลไปยังท้องถิ่น อย่างไรก็ตามฉันจะเพิ่มโซลูชันสำหรับการทำสิ่งที่ตรงกันข้าม: local to remote ในกรณีที่เป็นประโยชน์กับทุกคน ขอบคุณ!
sstur

3

sftp รองรับไฟล์แบตช์

จากหน้าคน:

-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*).

เนื่องจากนี่เป็นกระบวนการที่ฉันทำวันละหลายครั้งสำหรับไฟล์ต่างๆในที่ต่างๆจึงเป็นการดีที่จะสามารถจดจำคำสั่งที่ฉันสามารถพิมพ์ลงในบรรทัดเดียวในเทอร์มินัลของฉัน (ซึ่งจะเปิดตลอดเวลา) แล้วกด Enter การใช้--batchจะทำให้ฉันต้องใส่คำสั่งลงในไฟล์จากนั้นส่งไฟล์นั้นเป็นพารามิเตอร์ ฉันยังคงเล่นอยู่scpฉันรู้สึกว่ามันอาจมีทางออกของฉัน
Kyle

บางที 'คาดหวัง' คือสิ่งที่คุณกำลังมองหาในตอนนั้น linuxjournal.com/article/3065
synthesizerpatel

3

หรือ echo 'put {path to file}' | sftp {user}@{host}:{dir}ซึ่งจะทำงานได้ทั้งในยูนิกซ์และพาวเวอร์เชลล์


ไวยากรณ์นี้ใช้ได้กับ puttyftp (psftp) แค่คิดว่าฉันจะแบ่งปันเพราะนั่นคือเหตุผลที่ฉันมาที่นี่
9 Guy

1

การปรับเปลี่ยนเล็กน้อยดังต่อไปนี้ใช้ได้ผลกับฉันเมื่อใช้จากภายใน perl และ system () โทร:

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

1

คำตอบของ SCP

OP กล่าวถึง SCP ดังนั้นนี่คือสิ่งนั้น

ดังที่คนอื่น ๆ ชี้ให้เห็นว่า SFTP นั้นสร้างความสับสนเนื่องจากไวยากรณ์การอัปโหลดแตกต่างจากไวยากรณ์การดาวน์โหลดอย่างสิ้นเชิง จะได้รับเล็กน้อยง่ายต่อการจดจำถ้าคุณใช้รูปแบบเดียวกัน:

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

ในความเป็นจริงสิ่งนี้ยังคงเป็นระเบียบและเป็นสาเหตุที่ผู้คนยังคงใช้คำสั่งที่ "ล้าสมัย" เช่น SCP:

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

SCP นั้นปลอดภัย แต่ลงวันที่ มีข้อบกพร่องบางอย่างที่จะไม่ได้รับการแก้ไขกล่าวคือการหยุดทำงานหากเซิร์ฟเวอร์.bash_profileส่งข้อความ อย่างไรก็ตามในแง่ของการใช้งานผู้พัฒนาอยู่ข้างหน้าหลายปี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.