當前位置:首頁 » 文件傳輸 » shel腳本ftp下載文件
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

shel腳本ftp下載文件

發布時間: 2022-06-23 04:50:35

⑴ shell腳本中取ftp遠程伺服器文件的問題

ftp使用mget下載多個文件默認有提示,可以增加-i參數,表示不提示:

ftp-i-n<<!
...

一般如果在Windows下編輯的文件,傳到linux環境下,文件內容里會因為回車換行表示方式不一樣,會出現^M符號,可以在傳到linux環境後,可以使用dos2unix等工具轉換(該工具因linux版本不同可能並未默認安裝)。另外,要注意所傳文件是否是二進制還是一般文本文件,如果是二進制文件,最好在get前執行bin命令表示傳輸二進制文件。

⑵ shell腳本限時,用腳本實現ftp下載很多文件,每個文件最長5分鍾,超過則停止下載該文件,繼續下載另一個

我一般是用wget --timeout=seconds來做,腳本一行一個就行了。如果你電腦上有ncftpget,也可以用ncftpget -t seconds來做。

⑶ shell腳本中ftp問題

ftp 登錄後,我感覺是不支持shell語法的(目前還不確定),建議使用mget 下載多個文件!

⑷ shell腳本編寫ftp下載文件

wget是可以處理賬號密碼的,wget --help 你自己可以研究下。
如果願意付費,我可以幫你搞一個vbs腳本。
-----------------------------------
呵呵,放鬆,一切都會好起來的!

⑸ ftp腳本抓取數據 shell腳本怎麼寫

假設需要每天11:00自動使用ftp從伺服器server下的一個目錄下載文件到本地。
重點:ftp命令如何獲取用戶名,密碼。
vi ftps //編寫腳本ftps

#!/usr/bin/sh
ftp -i -in <<!
open 192.168.1.171 //連接到伺服器(假設為192.168.1.171)
user $ftpuser $password //用戶名和密碼
bin //以二進制傳送
cd / //到ftpuser的根目錄(
passive //如果出現no route to host提示,使用passive模式
mget $1 //獲取命令後加的參數(文件或者文件夾)
bye //退出


保存退出
chmod +x ftps
crontab -e
00 11 * * * /$path/ftps
保存退出
這樣在每天11點的時候就可以自動ftp下載數據了。

⑹ shell腳本:從遠程伺服器下載文件到本地

a.
至少有三種在外通用:
(1)setup
$home/.rhosts
for
rcp,
remsh
等等
(2)setup
$home/.netrc
for
ftp
(3)ssh,scp
要判斷文件是否下載成功,最簡單的就是用check
sum
(linux/unix的通用command是
cksum)。好比你用個script去scp
file回來後,應該也執行一個ssh去遠端做個cksum,把cksum的output存起來,回到local做同樣的cksum,兩個一比較就知道了。按理說,這些利用tcp/ip的protocol寫的自動會做error
checking而且要是有error自動會re-transmit,不過你還是要考慮local的file
system是不是爆了等等,所以最簡單的做法就是兩邊都做cksum一比就知道了。

⑺ 用shell的linux伺服器 .sh插件怎麼從遠程ftp伺服器下載文件

//ftpput.sh
[cpp] view plain
#!/bin/sh
#FileName:ftpput.sh
#Function:從本地客戶端向ftp伺服器上傳一個文件
#Version:V0.1
#Author:Sunrier
#Date:2012-07-20

#$#表示傳遞給此Shell腳本的參數個數
#-ne表示不等於
if [ $# -ne 2 ]
then
echo "Usage $0 <local_dir/filename> <remote_dir>"
exit 1
fi

#IP表示ftp的伺服器ip地址
IP=127.0.0.1
#IP=192.168.6.1

#FULLNAME獲取本地文件全路徑名
FULLNAME=$1

#DESTDIR獲取需要上傳的ftp遠程目錄路徑
DESTDIR=$2

#basename返回一個路徑中的文件名部分
#如FULLNAME="/home/Sunrier/Proj/log/test.log";
#當local_filename=`basename $FULLNAME`
#最終local_filename="test.log"
local_filename=`basename $FULLNAME`

#DESTFILE表示ftp伺服器的路徑,以及保存後的文件名
DESTFILE=$DESTDIR/$local_filename

#ftp -i -n $IP <<FTPIT
ftp -i -n <<FTPIT
open $IP
user Sunrier redhat
bin
passive
cd /home/remote/log/ftpfile
put $FULLNAME $DESTFILE
quit
FTPIT

exit 0

//注釋:
[cpp] view plain
#!/bin/sh
#FileName:ftpput.sh
#Function:從本地客戶端向ftp伺服器上傳一個文件
#Version:V0.1
#Author:Sunrier
#Date:2012-07-20

#$#表示傳遞給此Shell腳本的參數個數
#-lt表示小於
#-eq表示等於
#-ne表示不等於
if [ $# -ne 2 ]
then
echo "Usage $0 <local_dir/filename> <remote_dir>"
exit 1
fi

#IP表示ftp的伺服器ip地址
#IP=127.0.0.1
IP=192.168.6.1

#FULLNAME獲取本地文件全路徑名
FULLNAME=$1

#DESTDIR獲取需要上傳的ftp遠程目錄路徑
DESTDIR=$2

#basename返回一個路徑中的文件名部分
#如FULLNAME="/home/Sunrier/Proj/log/test.log";
#當local_filename=`basename $FULLNAME`
#最終local_filename="test.log"
local_filename=`basename $FULLNAME`

#DESTFILE表示ftp伺服器的路徑,以及保存後的文件名
DESTFILE=$DESTDIR/$local_filename

#-i表示在多個文件傳輸期間關閉交互提示
#-n表示禁止自動登錄到初始連接
#<<FTPIT 和最後的 FTPIT:術語叫:當前文檔here documents. here document 就是一段特殊目的的代碼塊,
#它使用I/O重定向的形式來將一個命令序列傳遞到一個交互程序或者命令中,比如ftp、cat,或者ex文本編輯器.
#本句可以理解從<<FTPIT開始以非對話模式的ftp連接,直到輸入FTPIT為止的所有命令.
#當然FTPIT這個名字是可以隨便取的,不一定必須是FTPIT,可以取其它的名字。
#ftp -i -n $IP <<FTPIT
ftp -i -n <<FTPIT

#連接到指定ftp伺服器上
open $IP
#連接到指定ftp伺服器上,並指定埠
#open $IP $PORT

#登陸ftp伺服器上的用戶名和密碼
#user username password
user Sunrier redhat

#bin表示以二進制方式傳輸
#bin等價於bi,binary等
#另一種方式傳輸是ascii,默認情況下,將文件傳輸類型設置為ASCII
bin

#主動模式的FTP是指伺服器主動連接客戶端的數據埠,被動模式的FTP是指伺服器被動地等待客戶端連接自己的數據埠
#被動模式的FTP通常用在處於防火牆之後的FTP客戶訪問外界FTP伺服器的情況.
#因為在這種情況下,防火牆通常配置為不允許外界訪問防火牆之後主機,而只允許由防火牆之後的主機發起的連接請求通過.
#因此在這種情況下不能使用主動模式的FTP傳輸,而被動模式的FTP可以良好的工作.
#passive表示設置為被動模式的FTP
passive

#cd表示更改ftp伺服器上(即遠程計算機)的工作目錄
cd /home/remote/log/ftpfile

#lcd表示更改本地計算機的工作目錄
#lcd /home/Sunrier/Proj/log/

#put local_file [ remote_file ]
#其中local_file是指定要復制的本地文件,remote_file是指定要復制的遠程計算機上的文件名,
#remote_file為可選項,如果不指定的話是和本地計算機上的文件名同名.
#put表示把本地路徑下的文件復制到FTP伺服器(遠程計算機)上設置的路徑下的文件
put $FULLNAME $DESTFILE

#quit表示結束與遠程計算機的FTP會話,並退出FTP.
#還有個等價的命令為bye(或by)結束與遠程計算機的FTP會話並退出FTP
quit

#here document塊結束
FTPIT

#正式寫這個Shell腳本時,here document中的#和空行都會執行,
#所以為了消除警告最好去掉here document塊中#開頭的語句以及空行,
#暫時我還沒有找到here document中有效的注釋語句的方法.

exit 0

//ftpget.sh
[cpp] view plain
#!/bin/sh
#FileName:ftpget.sh
#Function:從ftp伺服器上下載一個文件到本地計算機上
#Version:V0.1
#Author:Sunrier
#Date:2012-07-20

#$#表示傳遞給此Shell腳本的參數個數
#-ne表示不等於
if [ $# -ne 2 ]
then
echo "Usage $0 <remote_dir/filename> <local_dir>"
exit 1
fi

#IP表示ftp的伺服器ip地址
IP=127.0.0.1
#IP=192.168.6.1

#FULLNAME獲取從ftp伺服器上下載的文件全路徑名
FULLNAME=$1

#DESTDIR獲取從ftp伺服器上下載的文件所存放的本地計算機的目錄路徑
DESTDIR=$2

#remote_filename獲取從ftp伺服器上下載的文件名
remote_filename=`basename $FULLNAME`

#DESTFILE表示下載文件所存放的本地路徑,以及本地保存後的文件名
DESTFILE=$DESTDIR/$remote_filename

#ftp -i -n $IP <<FTPIT
ftp -i -n <<FTPIT
open $IP
user Sunrier redhat
bin
cd /home/remote/log/ftpfile
get $FULLNAME $DESTFILE
quit
FTPIT

exit 0

#get remote_file [ local_file ]
#remote_file是指定要復制的文件,local_file是指定本地計算機上的文件名,
#local_file為可選項,沒有指定的話則跟remote_file同名。

//20120726改進版本
[cpp] view plain
#!/bin/sh
#FileName:ftpput.sh
#Function:從本地客戶端向ftp伺服器上傳一個文件(添加遠程目錄是否存在判斷功能)
#Version:V0.2
#Author:Sunrier
#Date:2012-07-26

#$#表示傳遞給此Shell腳本的參數個數
#-ne表示不等於
if [ $# -ne 2 ]
then
echo "Usage $0 <local_dir/filename> <remote_dir>"
exit 1
fi

#IP表示ftp的伺服器ip地址
IP=127.0.0.1
#IP=192.168.6.1

#FULLNAME獲取本地文件全路徑名
FULLNAME=$1

#DESTDIR獲取需要上傳的ftp遠程目錄路徑
DESTDIR=$2

#dirname返迴路徑中的目錄部分
#DESTDIR="/home/Sunrier/Proj/log/test.log";
#當PREDESTDIR=`dirname $DESTDIR`
#最終PREDESTDIR="/home/Sunrier/Proj/log"
PREDESTDIR=`dirname $DESTDIR`
SUFFIXDESTDIR=`basename $DESTDIR`

LOCALDIR=`dirname $FULLNAME`

#basename返回一個路徑中的文件名部分
#如FULLNAME="/home/Sunrier/Proj/log/test.log";
#當local_filename=`basename $FULLNAME`
#最終local_filename="test.log"
local_filename=`basename $FULLNAME`

#DESTFILE表示ftp伺服器的路徑,以及保存後的文件名
DESTFILE=$DESTDIR/$local_filename

#ftp -i -n $IP <<FTPIT
ftp -i -n <<FTPIT
open $IP
user Sunrier redhat
dir $PREDESTDIR $LOCALDIR/tmp.txt
quit
FTPIT

#find $LOCALDIR -name "tmp.txt" -type f | xargs grep "^d.*$SUFFIXDESTDIR$"
#find . -name "tmp.txt" -type f | xargs grep "^d.*$SUFFIXDESTDIR$"
#find . ! -name "." -type d -prune -o -type f -iname "*tmp.txt" -print | xargs grep "^d.*$SUFFIXDESTDIR$"
#grep "^d.*$SUFFIXDESTDIR$" \$LOCALDIR/tmp.txt
#grep後面查找字元兩邊加不加引號效果相同

grep ^d.*$SUFFIXDESTDIR$ $LOCALDIR/tmp.txt >/dev/null 2>&1

#$?表示上一個命令的運行結果,0表示成功,其它值表示失敗
#if [ $? != 0 ]
if [ $? -ne 0 ]
then
rm $LOCALDIR/tmp.txt
exit 1
fi

#mkdir創建遠程目錄
#mkdir $DESTDIR

#ftp -i -n $IP <<FTPIT
ftp -i -n <<FTPIT
open $IP
user Sunrier redhat
bin
passive
cd /home/remote/log/ftpfile
put $FULLNAME $DESTFILE
quit
FTPIT

rm $LOCALDIR/tmp.txt
exit 0

[cpp] view plain
注:

FTP伺服器的啟動:
[root@localhost ~]# service vsftpd start
為 vsftpd 啟動 vsftpd: [確定]

FTP伺服器的埠一般默認為21:
[root@localhost ~]# netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:523 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:50000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:601 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN
tcp 0 0 :::22 :::* LISTEN
[root@localhost ~]#

在使用system執行Shell腳本時,如system("ftpput.sh"),system返回值低8位為system執行腳本所接收到的信號值,9~16位為Shell腳本所設置的exit退出值

⑻ 編寫腳本,如何實現自動ftp到相應的環境,並下載相應的文件(shell)

可是試試用 wget 下載。這個可以登錄下載一起完成。
組織一下寫入shell腳本中(因為你的具體情況我不清楚,所以腳本代碼不知道該怎麼給你寫,你自己寫進去吧):

wget -c -t 10 "ftp://user:passwd@IP/dir/file" & > /dev/null

===============
後台靜默執行,如果出錯會顯示出錯信息(沒有將錯誤信息送到null中就是此意)。
如果要指定要下載到的目錄,就這樣
wget -c -t 10 "ftp://user:passwd@IP/dir/file" -P 目標目錄
=========================

⑼ shell定時下載ftp文件並重命名放到指定文件夾

到你執行這個sh的用戶的mail文件裡面去看日誌,比如你是用的root用戶,那麼你可以打開/var/mail目錄下的root文件,裡面會記錄3點鍾crontab的執行情況。

一般來說問題2個方面:
1.這個sh本身不對,你可以單獨執行這個sh來調試
2.sh缺少執行許可權

有問題可以追問,希望對你有幫助

⑽ linux系統用shell寫個腳本ftp上傳下載文件,文件名帶日期。

這個不是一句話搞定的
vi xxxx.sh 寫一個腳本

#/bin/bash

DATE=`date "%Y%M%D"`
DIR=/xxxxx/xxx
cd $DIR
lftp -pxxx [email protected]
cd xxxxx
get $DATE.txt
exit

chmod +x xxxx.sh
然後 sh xxxx.sh

大致的結構這樣,具體的你要好好研究一下shell才可以。