scp遠端拷貝expect實現SHELL

2021-09-01 18:16:26 字數 4786 閱讀 5328

在linux上,我們可以很方便的使用scp命令來遠端拷貝檔案,但是由於scp命令本身無儲存密碼選項,所以在shell裡面無法像samba那樣子儲存密碼,比較麻煩,下面介紹下兩種實現方法。

方法一:

scp 遠端拷檔案,建議用搭配 ssh 方法:

1: 在客戶機上生成 ssh 需要的 rsa 金鑰: ssh-keygen -t rsa

2: 把生成的 id_rsa.pub拷到遠端伺服器使用者的 .ssh 目錄下,並更名為authorized_keys

這樣一來,scp 拷檔案就不需要密碼了

方法二:

#!/bin/bash

expect -c "

set timeout 1200; ##設定拷貝的時間,根據目錄大小決定,我這裡是1200秒。

spawn /usr/bin/scp -r 192.168.0.201:/work/backup/db_back/ /work/dbback/

expect

\"*password*\" ##遠端ip的密碼。

}expect eof;"

如果不設定timeout的話會自動退出,所以必須設定,或者用default欄位可以設定expect超時或退出時的動作。

expect用於自動化地執行linux環境下的命令列互動任務,例如scp、ssh之類需要使用者手動輸入密碼然後確認的任務。有了這個工具,定義在scp過程中可能遇到的情況,然後編寫相應的處理語句,就可以自動地完成scp操作了。

在部署乙個任務時,其中有一項必須的過程就是將一些檔案,如安裝包傳送到大量的伺服器上去。雖然已有宇哥的指令碼可用:通過paramiko模組提供的ssh和scp功能編寫的python指令碼。但我到現在還在對python的恐懼之中(雖然已經在空閒時間努力去學習了),所以使用了shell和expect指令碼結合的方式,寫了這個批量scp的指令碼工具。

expect用於自動化地執行linux環境下的命令列互動任務,例如scp、ssh之類需要使用者手動輸入密碼然後確認的任務。有了這個工具,定義在scp過程中可能遇到的情況,然後編寫相應的處理語句,就可以自動地完成scp操作了。

需要expect工具的話可以在linux環境中使用apt-get或pacman這些包管理工具去獲取安裝,或是到expect開源專案的**: 來獲取。

安裝expect之後,可以嘗試使用以下的**來完成對單個伺服器的scp任務:

#!/usr/bin/expect

set timeout 10

set host [lindex $argv 0]

set username [lindex $argv 1]

set password [lindex $argv 2]

set src_file [lindex $argv 3]

set dest_file [lindex $argv 4]

spawn scp $src_file $username@$host:$dest_file

expect

}"*assword:"

}expect "100%"

expect eof

注意**剛開始的第一行,指定了expect的路徑,與shell指令碼相同,這一句指定了程式在執行時到**去尋找相應的啟動程式。**剛開始還設定了timeout的時間為10秒,如果在執行scp任務時遇到了**中沒有指定的異常,則在等待10秒後該指令碼的執行會自動終止。

從以上**剛開始的幾行可以看出,我為這個指令碼設定了5個需要手動輸入的引數,分別為:目標主機的ip、使用者名稱、密碼、本地檔案路徑、目標主機中的檔案路徑。如果將以上指令碼儲存為expect_scp檔案,則在shell下執行時需要按以下的規範來輸入命令:

./expect_scp 192.168.75.130 root 123456 /root/src_file /root/dest_file

以上的命令執行後,將把本地/root目錄下的src_file檔案拷貝到使用者名為root,密碼為123456的主機192.168.75.130中的/root下,同時還將這個原始檔重新命名為dest_file。

spawn代表在本地終端執行的語句,在該語句開始執行後,expect開始捕獲終端的輸出資訊,然後做出對應的操作。expect**中的捕獲的(yes/no)內容用於完成第一次訪問目標主機時儲存金鑰的操作。有了這一句,scp的任務減少了中斷的情況。**結尾的expect eof與spawn對應,表示捕獲終端輸出資訊的終止。

有了這段expect的**,還只能完成對單個遠端主機的scp任務。如果需要實現批量scp的任務,則需要再寫乙個shell指令碼來呼叫這個expect指令碼。

shell指令碼:

#!/bin/sh

list_file=$1

src_file=$2

dest_file=$3

cat $list_file | while read line

dohost_ip=`echo $line | awk ''`

username=`echo $line | awk ''`

password=`echo $line | awk ''`

echo "$host_ip"

./expect_scp $host_ip $username $password $src_file $dest_file

done

指定了3個引數:列表檔案的位置、本地原始檔路徑、遠端主機目標檔案路徑。需要說明的是其中的列表檔案指定了遠端主機ip、使用者名稱、密碼,這些資訊需要寫成以下的格式:

ip username password

中間用空格或tab鍵來分隔,多台主機的資訊需要寫多行內容,如:

192.168.75.130 root 123456

192.168.75.131 knktc testpass

這樣就指定了兩台遠端主機的資訊。注意,如果遠端主機密碼中有「$」、「#」這類特殊字元的話,在編寫列表檔案時就需要在這些特殊字元前加上轉義字元,否則expect在執行時會輸入錯誤的密碼。

對於這個shell指令碼,儲存為batch_scp.sh檔案,與剛才儲存的expect_scp檔案和列表檔案(就定義為hosts.list檔案吧)放到同一目錄下,執行時按照以下方式輸入命令就可以了:

./batch_scp.sh ./hosts.list /root/src_file /root/destfile

用這兩個指令碼檔案,就可以簡單地完成批量scp的任務了。

scp 可以在 2個 linux 主機間複製檔案;

命令基本格式:

scp [可選引數] file_source file_target

從 本地 複製到 遠端

* 命令格式:

scp local_file remote_username@remote_ip:remote_folder

或者scp local_file remote_username@remote_ip:remote_file

或者scp local_file remote_ip:remote_folder

或者scp local_file remote_ip:remote_file

第1,2個指定了使用者名稱,命令執行後需要再輸入密碼,第1個僅指定了遠端的目錄,檔案名字不變,第2個指定了檔名;

第3,4個沒有指定使用者名稱,命令執行後需要輸入使用者名稱和密碼,第3個僅指定了遠端的目錄,檔案名字不變,第4個指定了檔名;

* 例子:

scp /home/space/music/1.*** [email protected]:/home/root/others/music

scp /home/space/music/1.*** [email protected]:/home/root/others/music/001.***

scp /home/space/music/1.*** www.cumt.edu.cn:/home/root/others/music

scp /home/space/music/1.*** www.cumt.edu.cn:/home/root/others/music/001.***

* 複製目錄:

* 命令格式:

scp -r local_folder remote_username@remote_ip:remote_folder

或者scp -r local_folder remote_ip:remote_folder

第1個指定了使用者名稱,命令執行後需要再輸入密碼;

第2個沒有指定使用者名稱,命令執行後需要輸入使用者名稱和密碼;

* 例子:

scp -r /home/space/music/ [email protected]:/home/root/others/

scp -r /home/space/music/ www.cumt.edu.cn:/home/root/others/

從 遠端 複製到 本地

例如:scp [email protected]:/home/root/others/music /home/space/music/1.***

scp -r www.cumt.edu.cn:/home/root/others/ /home/space/music/

最簡單的應用如下 :

scp 本地使用者名 @ip 位址 : 檔名 1 遠端使用者名稱 @ip 位址 : 檔名 2

[ 本地使用者名 @ip 位址 :] 可以不輸入 , 可能需要輸入遠端使用者名稱所對應的密碼 .

可能有用的幾個引數 :

-v 和大多數 linux 命令中的 -v 意思一樣 , 用來顯示進度 . 可以用來檢視連線 , 認證 , 或是配置錯誤 .

-c 使能壓縮選項 .

-p 選擇埠 . 注意 -p 已經被 rcp 使用 .

-4 強行使用 ipv4 位址 .

-6 強行使用 ipv6 位址 .

SCP遠端拷貝

linux 的 scp 命令 可以 在 linux 之間複製 檔案 和 目錄 scp 命令 scp 可以在 2個 linux 主機間複製檔案 命令基本格式 scp 可選引數 file source file target 從 本地 複製到 遠端 複製檔案 命令格式 scp local file re...

Linux遠端拷貝scp

linux的scp命令可以實現兩台伺服器之間互相拷貝檔案,我的測試環境是centos6.4.基本的命令格式 一 從本機拷貝到目標遠端主機 scp php 7.2.4.tar.gz root 192.168.9.142 usr local src 這裡是從當前主機拷貝到ip位142的區域網主機目錄 u...

自動遠端拷貝expect指令碼

自動遠端拷貝expect指令碼 expect自動遠端拷貝指令碼,利用rsync命令,指令碼內容如下 usr bin expect proc usage exit ifelseif else elseif elseif else else expect yes no fatal timeout no ...