上傳文件大多數用的是ftp,但是用ftp有一點不好,就是本地和遠程的目錄要對應,這樣就要在多個目錄下去切換,這樣挺麻煩的,如果不注意的話,很有可能傳錯。所以想了個辦法利用scp來批量上傳文件或者目錄。
一,scp上傳不要輸入密碼
如果要用scp來上傳文件,第一步就要去掉scp上傳時要輸入密碼。要不然就沒辦法批量上傳了。具體請參考:ssh 不用輸入密碼
二,ssh批量上傳腳本
1,要上傳的文件列表放到一個test文件中
- root@ubuntu:/home/zhangy# cat test
- /home/zhangy/test/aaa
- /home/zhangy/test/nginx.conf
- /home/zhangy/test/test.sql
- /home/zhangy/test/pa.txt
- /home/zhangy/test/password
root@ubuntu:/home/zhangy# cat test /home/zhangy/test/aaa /home/zhangy/test/nginx.conf /home/zhangy/test/test.sql /home/zhangy/test/pa.txt /home/zhangy/test/password
上面就要上傳的文件。
2,批量上傳的腳本
vim file_upload.sh
- #!/bin/sh
- DATE=`date +%Y_%m_%d_%H`
- if [ $1 ]
- then
- for file in $(sed '/^$/d' $1) //去掉空行
- do
- if [ -f $file ] //普通文件
- then
- res=`scp $file $2:$file` //上傳文件
- if [ -z $res ] //上傳成功
- then
- echo $file >> ${DATE}_upload.log //上傳成功的日誌
- fi
- elif [ -d $file ] //目錄
- then
- res=`scp -r $file $2:$file`
- if [ -z $res ]
- then
- echo $file >> ${DATE}_upload.log
- fi
- fi
- done
- else
- echo "no file" >> ${DATE}_error.log
- fi
#!/bin/sh DATE=`date +%Y_%m_%d_%H` if [ $1 ] then for file in $(sed '/^$/d' $1) //去掉空行 do if [ -f $file ] //普通文件 then res=`scp $file $2:$file` //上傳文件 if [ -z $res ] //上傳成功 then echo $file >> ${DATE}_upload.log //上傳成功的日誌 fi elif [ -d $file ] //目錄 then res=`scp -r $file $2:$file` if [ -z $res ] then echo $file >> ${DATE}_upload.log fi fi done else echo "no file" >> ${DATE}_error.log fi
上傳成功後,返回的是一個空行,上傳不成功,什麼都不返回
3,上傳的格式
- ./file_upload.sh test 192.168.1.13
./file_upload.sh test 192.168.1.13
test是上傳列表文件,192.168.1.13文件要傳到的地方。