it-swarm-vi.tech

Làm cách nào để tải tệp (FTP) lên máy chủ trong tập lệnh bash?

Tôi đang cố gắng viết một tập lệnh bash tải tập tin lên máy chủ. Làm thế nào tôi có thể đạt được điều này? Là một tập lệnh bash là điều đúng đắn để sử dụng cho điều này?

42
Andrew

Dưới đây là hai câu trả lời. Đầu tiên là một gợi ý để sử dụng một giải pháp an toàn/linh hoạt hơn như ssh/scp/sftp. Thứ hai là giải thích về cách chạy ftp trong chế độ hàng loạt. 

Một giải pháp an toàn:

Bạn thực sự nên sử dụng SSH/SCP/SFTP cho việc này hơn là FTP. SSH/SCP có các lợi ích là an toàn hơn và hoạt động với các khóa công khai/riêng tư cho phép nó chạy mà không cần tên người dùng hoặc mật khẩu.

Bạn có thể gửi một tập tin duy nhất:

scp <file to upload> <username>@<hostname>:<destination path>

Hoặc toàn bộ thư mục:

scp -r <directory to upload> <username>@<hostname>:<destination path>

Để biết thêm chi tiết về cách thiết lập khóa và di chuyển tệp đến máy chủ bằng RSYNC, rất hữu ích nếu bạn có nhiều tệp để di chuyển hoặc nếu đôi khi bạn chỉ nhận được một tệp mới trong số các tệp ngẫu nhiên, hãy xem:

http://troy.jdmz.net/rsync/index.html

Bạn cũng có thể thực thi một lệnh duy nhất sau khi sshing vào máy chủ:

Từ man ssh

ssh [... snipped ...] hostname [lệnh] Nếu lệnh được chỉ định, đó là được thực thi trên Host từ xa thay vì Shell đăng nhập.

Vì vậy, một lệnh ví dụ là:

ssh [email protected] bunzip file_just_sent.bz2

Nếu bạn có thể sử dụng SFTP với các khóa để đạt được lợi ích của kết nối được bảo mật, có hai thủ thuật tôi đã sử dụng để thực thi các lệnh.

Đầu tiên, bạn có thể truyền lệnh bằng echo và pipe

echo "put files*.xml" | sftp -p -i ~/.ssh/key_name [email protected]

Bạn cũng có thể sử dụng một tệp dữ liệu với tham số -b:

sftp -b batchfile.txt ~/.ssh/key_name [email protected]

Một giải pháp FTP, nếu bạn thực sự cần nó:

Nếu bạn hiểu rằng FTP không an toàn và hạn chế hơn và bạn thực sự muốn kịch bản nó ...

Có một bài viết tuyệt vời về điều này tại http://www.stratigery.com/scripting.ftp.html

#!/bin/sh
Host='ftp.example.com'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $Host <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
binary
put $FILE
quit
END_SCRIPT
exit 0

"-N" to ftp đảm bảo rằng lệnh sẽ không cố lấy mật khẩu từ thiết bị đầu cuối hiện tại. Phần ưa thích khác là việc sử dụng một di sản: <<END_SCRIPT khởi động heredoc và sau đó chính xác là END_SCRIPT ở đầu dòng tự kết thúc di truyền. Lệnh binary sẽ đặt nó ở chế độ nhị phân, giúp bạn chuyển một thứ khác không phải là tệp văn bản.

51
greggles

Bạn có thể sử dụng a heredoc để làm điều này, ví dụ:.

ftp -n $Server <<End-Of-Session
# -n option disables auto-logon

user anonymous "$Password"
binary
cd $Directory
put "$Filename.lsm"
put "$Filename.tar.gz"
bye
End-Of-Session

vì vậy quá trình ftp được cung cấp trên stdin với mọi thứ lên tới End-Of-Session. Một mẹo hữu ích để sinh ra bất kỳ quá trình, không chỉ ftp! Lưu ý rằng điều này giúp tiết kiệm một quá trình riêng biệt (echo, cat, v.v.). Không phải là một tiết kiệm tài nguyên lớn, nhưng đáng ghi nhớ.

76
Brian Agnew

Cài đặt ncftpput và ncftpget. Chúng thường là một phần của cùng một gói.

18
Paul Tomblin

lệnh trong một dòng:

ftp -in -u ftp://username:[email protected]/path/to/ localfile
6
Chizhik

sử dụng điều này để tải một tập tin lên một vị trí từ xa

#!/bin/bash
#$1 is the file name
#usage:this_script <filename>
Host='your Host'
USER="your user"
PASSWD="pass"
FILE="abc.php"
REMOTEPATH='/html'

ftp -n $Host <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
cd $REMOTEPATH
put $FILE 
quit
END_SCRIPT
exit 0
6
Shal
#/bin/bash
# $1 is the file name
# usage: this_script  <filename>
IP_address="xx.xxx.xx.xx"
username="username"
domain=my.ftp.domain
password=password

echo "
 verbose
 open $IP_address
 USER $username $password
 put $1
 bye
" | ftp -n > ftp_$$.log
4
ennuikiller

Không cần phức tạp hóa công cụ - điều này sẽ làm việc:

#/bin/bash
echo "
 verbose
 open ftp.mydomain.net
 user myusername mypassword
 ascii
 put textfile1
 put textfile2
 bin
 put binaryfile1
 put binaryfile2
 bye
" | ftp -n > ftp_$$.log

hoặc bạn có thể sử dụng mput nếu bạn có nhiều tệp ...

3
Martin Hvidberg

Ví dụ hoạt động để đặt tệp của bạn trên Root ........... thấy nó rất đơn giản

#!/bin/sh
Host='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $Host <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
put $FILE
quit
END_SCRIPT
exit 0
1
Shal

nếu bạn muốn sử dụng nó trong 'for' để sao chép các tệp được tạo cuối cùng cho bacakup mỗi ngày ...

j=0  
var="`find /backup/path/ -name 'something*' -type f -mtime -1`"  
#we have in $var some files with last day change date

for i in $var  
  do  
  j=$(( $j + 1 ))  
  dirname="`dirname $i`"  
  filename="`basename $i`"  
  /usr/bin/ftp -in >> /tmp/ftp.good 2>> /tmp/ftp.bad << EOF  
    open 123.456.789.012  
    user user_name passwd  
    bin  
    lcd $dirname  
    put $filename  
    quit  
  EOF      #end of ftp  
done       #end of for iteration
0
oso_togari

Lệnh ftp không được thiết kế cho các tập lệnh, vì vậy việc kiểm soát nó thật khó xử và việc lấy trạng thái thoát của nó thậm chí còn khó xử hơn.

Curl được tạo thành tập lệnh và cũng có giá trị là bạn có thể dễ dàng chuyển sang các giao thức khác sau đó chỉ bằng cách sửa đổi URL. Nếu bạn đặt thông tin đăng nhập FTP của mình vào . Netrc , bạn chỉ cần làm:

# Download file
curl --netrc --remote-name ftp://ftp.example.com/file.bin
# Upload file
curl --netrc --upload-file file.bin ftp://ftp.example.com/

Nếu bạn phải, bạn có thể chỉ định tên người dùng và mật khẩu trực tiếp trên dòng lệnh bằng cách sử dụng --user username:password thay vì --netrc.

0
Pelle Nilsson

cd C:\Tệp chương trình (x86)\WinSCP

woncp.exe/console/lệnh "mở Tên người dùng:* * @ Server" "đặt đường dẫn tệp" 

0
Naveen Sharma