Một tuyến sftp từ nhà ga


91

Nhiều lần trong ngày, tôi có thể đang chạy thử nghiệm mà tôi cần xem qua tệp nhật ký trên máy chủ từ xa. Tôi đã quen với việc sử dụng thiết bị đầu cuối của mình để sftpvào máy chủ từ xa và kéo tệp nhật ký mong muốn xuống /tmptrên máy cục bộ của mình.

Hôm nay tôi đã xem qua các tùy chọn bằng cách sử dụng man sftpđể cố gắng tìm ra cách chạy các lệnh sau về cơ bản trong một dòng duy nhất để tôi không phải nhập lệnh, nhấn enter, nhập lệnh nhấn enter, v.v.

(tôi làm gì bây giờ)

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

Tôi đã tìm thấy trong khi xem qua man sftpmột tài liệu tham khảo scpmà tôi chưa sử dụng trước đây. Tôi cảm thấy đó có thể là thứ tôi đang tìm kiếm, nhưng tôi không thấy cách nào để chỉ định nơi tôi muốn tệp được sao chép an toàn đi đến.

Ai đó có thể cung cấp cho tôi cách truy cập /dir/filetừ máy chủ từ xa và tải nó xuống /tmp/file_plus-my-descriptionkhông?

Tôi đã hy vọng có thể chạy lệnh sftp hoặc scp tương tự như bản saoUNIX thông thường như:

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

Tôi đang sử dụng cài sẵn Terminaltrong Mac OS X 10.8. Cảm ơn.

Câu trả lời:


201

Cập nhật tháng 9 năm 2017 - tl; dr

Tải xuống một tệp từ máy chủ ftp từ xa vào máy của bạn:

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

Tải một tệp duy nhất từ ​​máy của bạn lên máy chủ ftp từ xa:

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

Câu trả lời ban đầu:

Ok, nên tôi cảm thấy hơi ngớ người. Nhưng tôi đã tìm ra. Tôi gần như đã có nó ở đầu với:

sftp user@host remoteFile localFile

Tài liệu duy nhất được hiển thị trong thiết bị đầu cuối là:

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

Tuy nhiên, tôi đã xem qua trang web này hiển thị những điều sau trong phần tóm tắt:

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

Vì vậy, câu trả lời đơn giản là bạn chỉ cần làm :sau người dùng và máy chủ của bạn, sau đó là tệp từ xa và tên tệp cục bộ. Cực kỳ đơn giản!

Một dòng, sao chép tệp từ xa sftp:

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

Cập nhật tháng 2 năm 2016

Trong trường hợp bất kỳ ai đang tìm kiếm lệnh để thực hiện ngược lại điều này và đẩy tệp từ máy tính cục bộ của bạn đến máy chủ từ xa bằng một sftp lệnh duy nhất , người dùng @Thariama dưới đây đã đăng giải pháp để thực hiện điều đó. Mẹo mũ cho họ để có thêm mã.

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

20
tôi đang hỏi ngược lại (sao chép vào máy chủ từ xa), nhưng tôi đã tự tìm được: sftp {user} @ {host}: {dir} <<< $ 'put {path to file}'
Thariama

2
Tôi xin lỗi, đã hiểu lầm. Tôi sẽ sao chép phản hồi của bạn vào câu trả lời trong trường hợp nó có thể giúp ích cho ai đó trong tương lai. Cảm ơn @Thariama
Kyle

1
Đối với chúng tôi TL: DR -types, hơi khó hiểu khi có giải pháp không chính xác là hàng được đánh dấu đầu tiên :-)
skoll 21/09/17

1
@Kyle, tốt hơn nhiều!
skoll

1
Tôi thấy kỳ lạ là sftp không bao gồm tùy chọn tải lên tệp trong một lệnh duy nhất. Điều này hoạt động tốt, nhưng nó quá khó đối với một hoạt động đơn giản như vậy. Đó vẫn là thứ duy nhất tôi có thể tìm thấy thực sự hoạt động hiệu quả, vì vậy cảm ơn. :)
Teekin

7

Để TẢI LÊN một tệp duy nhất, bạn sẽ cần tạo một tập lệnh bash. Một cái gì đó như sau sẽ hoạt động trên OS X nếu bạn đã sshpasscài đặt.

Sử dụng:

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

Đặt tập lệnh này ở đâu đó trong đường dẫn của bạn và gọi nó là 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

Tuy nhiên, cảm ơn bạn đã trả lời, câu trả lời mà tôi đã biểu thị ở trên sẽ sử dụng lệnh dòng đơn với sftp để lấy tệp từ máy chủ từ xa và lưu tệp vào một vị trí cụ thể trên máy cục bộ của bạn. Tôi đã xác minh rằng nó sẽ hoạt động trên OS X chỉ với sftp.
Kyle

2
Vâng, đó chắc chắn là câu trả lời tốt nhất cho việc chuyển từ xa đến địa phương. Tuy nhiên, tôi muốn thêm một giải pháp để làm điều ngược lại: cục bộ thành từ xa. Chỉ trong trường hợp nó hữu ích cho bất kỳ ai. Cảm ơn!
sstur

3

sftp hỗ trợ các tệp hàng loạt.

Từ trang người đàn ông:

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

Vì đây là một quá trình tôi thực hiện nhiều lần trong ngày cho các tệp khác nhau ở những nơi khác nhau, sẽ rất tuyệt nếu có thể ghi nhớ một lệnh mà tôi có thể nhập vào một dòng duy nhất trong thiết bị đầu cuối của mình (luôn mở) và nhấn enter. Việc sử dụng --batchsẽ yêu cầu tôi đặt các lệnh của mình vào một tệp rồi chuyển tệp đó dưới dạng tham số. Tôi vẫn đang chơi với scp, tôi cảm thấy nó có thể chứa giải pháp của tôi.
Kyle

Có thể 'mong đợi' là thứ bạn đang tìm kiếm lúc đó. linuxjournal.com/article/3065
synthesizerpatel

3

Hoặc echo 'put {path to file}' | sftp {user}@{host}:{dir}, sẽ hoạt động trong cả unix và powershell.


Cú pháp này cũng hoạt động với puttyftp (psftp). Tôi chỉ nghĩ rằng tôi sẽ chia sẻ vì đó là lý do tôi kết thúc ở đây
9 Guy

1

Một sửa đổi nhỏ như bên dưới đã phù hợp với tôi khi sử dụng nó từ bên trong lệnh gọi perl và system ():

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

1

Câu trả lời SCP

OP đã đề cập đến SCP, vì vậy đây là điều đó.

Như những người khác đã chỉ ra, SFTP là một sự nhầm lẫn vì cú pháp tải lên hoàn toàn khác với cú pháp tải xuống . Nó sẽ dễ nhớ hơn một chút nếu bạn sử dụng cùng một biểu mẫu:

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

Trên thực tế, đây vẫn là một mớ hỗn độn, và đó là lý do tại sao mọi người vẫn sử dụng các lệnh "lỗi thời" như SCP:

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

SCP được bảo mật nhưng có niên đại. Nó có một số lỗi sẽ không bao giờ được sửa, cụ thể là sự cố nếu máy chủ .bash_profilephát ra thông báo. Tuy nhiên, về khả năng sử dụng, các nhà phát triển đã đi trước nhiều năm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.