幾種方法來實現scp拷貝時無需輸入密碼

2021-09-04 04:33:53 字數 2427 閱讀 7557

前言

我在工作中經常要將一些檔案傳輸到另外乙個伺服器上,而且都是linux的命令列環境,那麼對於我來講scp就是最直接有效的方法了,其他諸如ftp、smb以及winscp這些有介面的檔案傳輸工具到反而有些多餘了。

使用過scp的都知道需要指定遠端伺服器的帳號並手動輸入密碼,那麼如何避免每次都需要輸入密碼這個操作呢?下面就給出兩種方案進行解決。

sshpass - noninteractive ssh password provider

從描述上就可以清晰的了解到,sshpass的設計就是為了使用非互動的場景下輸入ssh連線的密碼。

sshpass的使用比較簡單,先看一下幫助文件:

nfer@nfer-virtualbox:~$ sshpass 

usage: sshpass [-f|-d|-p|-e] [-hv] command parameters

-f filename   take password to use from file

-d number     use number as file descriptor for getting password

-p password   provide password as argument (security unwise)

-e            password is passed as env-var "sshpass"

with no parameters - password will be taken from stdin

-h            show help (this screen)

-v            print version information

at most one of -f, -d, -p or -e should be used

其中-p是直接指定密碼,-f是從檔案中讀取密碼。那麼乙個使用sshpass的簡單例子就是:

sshpass -p nferzhuang scp a.txt [email protected]:/home/nferzhuang/a.txt

使用sshpass的好處就是方便直接,無需了解公私鑰、加密認證等相關知識,簡單易懂;但是使用sshpass最大的壞處就是再使用時會涉及到明文密碼,大大降低了安全性。

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

下面就是乙個使用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需要了解的一點是:用expect速度會比較慢,因為需要等待返回的資料,然後輸入命令執行,沒有ssh金鑰登入的快速。

總結在本文中提供了三種方法來實現scp的時候無需輸入密碼的需求,從安全性和速度上考慮建立信任關係都是最佳的方法,至於在具體的環境中選擇什麼則由你自己來決定。

JS拷貝的幾種方法

淺拷貝 1.對於陣列型別,可以使用slice start,end 方法,返回乙個新的陣列。var arr1 arr.slice 0 備註 slice 方法一直複製到 end 所指定的元素,但是不包括該元素。如果 start 為負,將它作為 length start處理,此處 length 為陣列的長...

JS中實現深拷貝的幾種方法

一,物件深拷貝的幾種方法 1.使用遞迴的方式實現深拷貝 1 function deepclone obj 3 if obj typeof obj object else 10 11 12 return objclone 13 2.通過json物件實現深拷貝 function deepclone2 o...

深拷貝和淺拷貝的幾種方法

for in 迴圈 var a var b for var k in a 2.object.assgin 與 號區別在於,修改了a.name就會變化,而這個不會變,但是這個到下面一層也會變化!就是說等號只進行了一層深拷貝。var a var b object.assign a 如果b原來是有屬性的物...