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?
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.
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]
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.
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ớ.
Cài đặt ncftpput và ncftpget. Chúng thường là một phần của cùng một gói.
lệnh trong một dòng:
ftp -in -u ftp://username:[email protected]/path/to/ localfile
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
#/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
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 ...
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
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
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
.
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"