前言
我在工作中經常要將一些檔案傳輸到另外乙個伺服器上,而且都是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原來是有屬性的物...