『壹』 如何在腳本中執行scp時自動輸入密碼
腳本如下:x0dx0ax0dx0a#!/usr/bin/expect -fx0dx0ax0dx0aset password 密碼x0dx0ax0dx0aspawn scp 用戶名@目標機器ip:拷貝文件的路徑 存放本地文件的路徑 x0dx0aset timeout 300 x0dx0aexpect "用戶名@目標機器ip's password:" #注意:這里的「用戶名@目標機器ip」 跟上面的一致x0dx0aset timeout 300 x0dx0asend "$password\r"x0dx0aset timeout 300 x0dx0asend "exit\r"x0dx0ax0dx0aexpect eofx0dx0ax0dx0a附:scp參數x0dx0a-r:拷貝目錄x0dx0a-c:允許壓縮x0dx0ax0dx0a一個完整的例子x0dx0ax0dx0a#!/usr/bin/expect -fx0dx0aset password 123456x0dx0a#downloadx0dx0aspawn scp [email protected]:/root/a.wmv /home/yangyz/x0dx0aset timeout 300 x0dx0aexpect "[email protected]'s password:"x0dx0aset timeout 300 x0dx0asend "$password\r"x0dx0aset timeout 300 x0dx0asend "exit\r"x0dx0aexpect eof x0dx0ax0dx0a#uploadx0dx0aspawn scp /home/yangyz/abc.sql [email protected]:/root/test.sql x0dx0aset timeout 300 x0dx0aexpect "[email protected]'s password:"x0dx0aset timeout 300 x0dx0asend "$password\r"x0dx0aset timeout 300 x0dx0asend "exit\r"x0dx0aexpect eof
『貳』 scp命令詳解
轉自:https://www.cnblogs.com/likui360/p/6011769.html
先說下常用的情況:
兩台機器IP分別為:A.104.238.161.75,B.43.224.34.73。
在A伺服器上操作,將B伺服器上/home/lk/目錄下所有的文件全部復制到本地的/root目錄下,命令為:scp -r [email protected]:/home/lk /root。
具體過程為:
[root@XX ~]#scp-r [email protected]:/home/lk /root
[email protected]'s password: k2.sql100%00.0KB/s00:00
k.zip100%1760.2KB/s00:00
.bash_history 100%320.0KB/s00:00
.bash_logout 100%180.0KB/s00:00
.bashrc 100%2310.2KB/s00:00
k3.sql 100%00.0KB/s00:00
.bash_profile 100%1930.2KB/s00:00
[root@XX ~]#ls
在A伺服器上將/root/lk目錄下所有的文件傳輸到B的/home/lk/cpfile目錄下,命令為:scp -r /root/lk [email protected]:/home/lk/cpfile。
具體過稱為:
[root@XX lk]#scp-r /root/lk [email protected]:/home/lk/cpfile
[email protected]'s password: k2.sql100%00.0KB/s00:00
k3.sql 100%00.0KB/s00:00
.bash_profile 100%1930.2KB/s00:00
.bash_logout 100%180.0KB/s00:00
.bash_history 100%320.0KB/s00:00
k.zip100%1760.2KB/s00:00
.bashrc 100%2310.2KB/s00:00
[root@XX lk]#
scp在誇機器復制的時候為了提高數據的安全性,使用了ssh連接和加密方式,如果機器之間配置了 ssh免密碼登錄 ,那在使用scp的時候密碼都不用輸入。
命令詳解:
scp是secure 的簡寫,用於在linux下進行遠程拷貝文件的命令,和它類似的命令有cp,不過cp只是在本機進行拷貝不能跨伺服器,而且scp傳輸是加密的。可能會稍微影響一下速度。當你伺服器硬碟變為只讀 read only system時,用scp可以幫你把文件移出來。另外,scp還非常不佔資源,不會提高多少系統負荷,在這一點上,rsync就遠遠不及它了。雖然 rsync比scp會快一點,但當小文件眾多的情況下,rsync會導致硬碟I/O非常高,而scp基本不影響系統正常使用。
1.命令格式:
scp [參數] [原路徑] [目標路徑]
2.命令功能:
scp是 secure 的縮寫, scp是linux系統下基於ssh登陸進行安全的遠程文件拷貝命令。linux的scp命令可以在linux伺服器之間復制文件和目錄。
3.命令參數:
-1 強制scp命令使用協議ssh1
-2 強制scp命令使用協議ssh2
-4 強制scp命令只使用IPv4定址
-6 強制scp命令只使用IPv6定址
-B 使用批處理模式(傳輸過程中不詢問傳輸口令或短語)
-C 允許壓縮。(將-C標志傳遞給ssh,從而打開壓縮功能)
-p 保留原文件的修改時間,訪問時間和訪問許可權。
-q 不顯示傳輸進度條。
-r 遞歸復制整個目錄。
-v 詳細方式顯示輸出。scp和ssh(1)會顯示出整個過程的調試信息。這些信息用於調試連接,驗證和配置問題。
-c cipher 以cipher將數據傳輸進行加密,這個選項將直接傳遞給ssh。
-F ssh_config 指定一個替代的ssh配置文件,此參數直接傳遞給ssh。
-i identity_file 從指定文件中讀取傳輸時使用的密鑰文件,此參數直接傳遞給ssh。
-l limit 限定用戶所能使用的帶寬,以Kbit/s為單位。
-o ssh_option 如果習慣於使用ssh_config(5)中的參數傳遞方式,
-P port 注意是大寫的P, port是指定數據傳輸用到的埠號
-S program 指定加密傳輸時所使用的程序。此程序必須能夠理解ssh(1)的選項。
4.使用實例:
scp命令的實際應用概述:
從本地伺服器復制到遠程伺服器:
(1) 復制文件:
命令格式:
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個指定了文件名
(2) 復制目錄:
命令格式:
scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder
第1個指定了用戶名,命令執行後需要輸入用戶密碼;
第2個沒有指定用戶名,命令執行後需要輸入用戶名和密碼;
『叄』 如何在腳本中執行scp時自動輸入密碼
用Perl或者其他腳本的時候,都會遇到需要輸入密碼的問題,導致腳本會被中斷。
如何才能不被中斷,SCP可以自動輸入密碼呢,腳本順利執行呢?我用了一個sshpass工具。
1.下載地址:
http://sourceforge.net/projects/sshpass/
2.安裝:
./configure
make
make install
3.為了能在任意地方執行命令 cp sshpass
/usr/bin/
4.執行的命令如下:
sshpass -p
$PASSWD scp -o StrictHostKeyChecking=no $CMD
『肆』 如何使得執行scp命令時不需要輸入用戶密碼
最近在編寫定時自動執行的shell腳步中遇到一個問題。在該腳步中,需要使用scp命令將本地的文件復制到另一台機器中備份。但通常執行scp命令後都需要輸入用戶密碼,這樣在定時自動執行的shell腳步中就不適用了。本人的第一直覺就是建立無密碼用戶,在scp命令中使用該用戶就不需要輸入用戶密碼了。以下為了討論方便,我們將執行scp命令的機器稱為Client,scp命令操作的遠端機器稱為Server。
SCP命令使用說明
首先,我通過以下命令將機器Server上root的密碼刪除,即使root變為無密碼用戶。
[root@Server root]# passwd -d root
Removing password for user root.
passwd: Success
[root@Server root]#
為了確認root已經變為無密碼用戶,登錄試試。
Red Hat Linux release 8.0 (Psyche)
Kernel 2.4.18-14 on an i686
Server login: root
Last login: Fri Sep 14 16:40:08 on tty1
[root@Server root]#
確實root登錄時已經不需要密碼了。
然後,我們從機器Client復制一個文件到機器Server。
[root@Client root]# scp -p text [email protected]:/root
[email protected]'s password: <-- 直接輸入回車
Permission denied, please try again. <-- 被拒絕
[email protected]'s password: <-- 輸入任意字元
text 100% |**************************| 19 00:00
[root@Client root]#
從測試結果可知,即使root變為無密碼用戶,scp命令在執行時也會提示輸入密碼。更奇怪的是在提示輸入密碼時,直接輸入回車被拒絕了。但輸入其它任意字元後輸入回車確認就通過認證了。
後來在Internet中查找相關資料,有資料[1]介紹在兩台機器的兩個用戶之間建立安全的信任關系後,可實現執行scp命令時不需要輸入用戶密碼。我根據該資料介紹的方法測試成功了。
以下是在機器Client的root和機器Server的root之間建立安全信任關系的步驟:
1. 在機器Client上root用戶執行ssh-keygen命令,生成建立安全信任關系的證書。
[root@Client root]# ssh-keygen -b 1024 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <-- 直接輸入回車
Enter same passphrase again: <-- 直接輸入回車
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
49:9c:8a:8f:bc:19:5e:8c:c0:10:d3:15:60:a3:32:1c root@Client
[root@Client root]#
注意:在程序提示輸入passphrase時直接輸入回車,表示無證書密碼。
上述命令將生成私鑰證書id_rsa和公鑰證書id_rsa.pub,存放在用戶家目錄的.ssh子目錄中。
2. 將公鑰證書id_rsa.pub復制到機器Server的root家目錄的.ssh子目錄中,同時將文件名更換為authorized_keys。
[root@Client root]# scp -p .ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys
[email protected]'s password: <-- 輸入機器Server的root用戶密碼
id_rsa.pub 100% |**************************| 218 00:00
[root@Client root]#
在執行上述命令時,兩台機器的root用戶之間還未建立安全信任關系,所以還需要輸入機器Server的root用戶密碼。
經過以上2步,就在機器Client的root和機器Server的root之間建立安全信任關系。下面我們看看效果:
[root@Client root]# scp -p text [email protected]:/root
text 100% |**************************| 19 00:00
[root@Client root]#
成功了!真的不再需要輸入密碼了。