ssh安全的自動登入
A為本地主機(即用於控制其他主機的機器) ;
B為遠程主機(即被控制的機器Server), 假如ip為172.24.253.2 ;
A和B的系統都是Linux
在A上的命令:
代碼如下 |
複製代碼 |
# ssh-keygen -t rsa (連續三次斷行符號,即在本地產生了公開金鑰和私密金鑰,不設定密碼) # ssh root@172.24.253.2 "mkdir .ssh;chmod 0700 .ssh" (需要輸入密碼) # scp ~/.ssh/id_rsa.pub root@172.24.253.2:.ssh/id_rsa.pub (需要輸入密碼) |
在B上的命令:
代碼如下 |
複製代碼 |
# touch /root/.ssh/authorized_keys2 (如果已經存在這個檔案, 跳過這條) # cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys2 (將id_rsa.pub的內容追加到 authorized_keys2 中) |
回到A機器:
代碼如下 |
複製代碼 |
# ssh root@172.24.253.2 (不要求輸入密碼, 登入成功) |
如果能保護好自己的私密金鑰, 這種方法相對在shell上輸入密碼, 要安全一些
執行個體
任務描述:
使用shell指令碼登入遠程伺服器,並執行命令:添加反向 Proxy網站。Windows使用者的方法見文末。
範例程式碼的功能:
登入遠程linux伺服器並在上邊執行命令後返回當前linux主機,執行的命令為“在遠程伺服器上執行一個添加反向 Proxy網站的命令”。添加網站需要知道網域名稱,所以這個指令碼有一個參數,這個參數就是網域名稱。
範例程式碼的用法:
代碼如下 |
複製代碼 |
raps.sh xxxxx.com raps.sh代碼: #!/usr/bin/expect # 名稱:Remote Add Proxy Site,^_^ # 說明:自動登上遠程伺服器後添加反向 Proxy網站(配置內建) # 注意:需要傳遞一個網域名稱參數,指令碼中的proxySiteAdd是遠程伺服器上的添加網站工具 # 用法:raps xxxx.com # 2012-11-02 08:55:21 # 配置 set user upall set passwd upall@remote set server 158.164.198.210 set port 2222 set dn [lindex $argv 0] # 登入並執行命令 spawn ssh $user@$server -p $port expect "password:" send "${passwd}n" expect "]# " send "proxySiteAdd ${dn}n" expect "]# " exit |
補充:
1、“expect "]# "”用於接收終端輸出,如果輸出中有“]# ”標誌就往下繼續執行命令;send 用於在遠程伺服器上執行命令。
2、傳遞參數時不能直接使用“$1”、“$2”,“set dn [lindex $argv 0]”會把第0個參數賦值給$dn,若是“set dn [lindex $argv 2]”會把第3個參數賦值給$dn。
代碼如下 |
複製代碼 |
#!/bin/bash HTTPD_CONF="/etc/httpd/conf/vhosts.conf" # 產生apache虛擬機器主機設定檔(反向 Proxy) echo "<VirtualHost *:80>">> $HTTPD_CONF echo " ServerName www.$1">> $HTTPD_CONF echo " ServerAlias $1">> $HTTPD_CONF echo " ProxyRequests Off">> $HTTPD_CONF echo " <Proxy *>">> $HTTPD_CONF echo " Order deny,allow">> $HTTPD_CONF echo " Allow from all">> $HTTPD_CONF echo " </Proxy>">> $HTTPD_CONF echo " ProxyPass / http://$1.demo.upall.cn/">> $HTTPD_CONF echo " ProxyPassReverse / http://$1.demo.upall.cn/">> $HTTPD_CONF echo "</VirtualHost>">> $HTTPD_CONF echo "CONF: "$HTTPD_CONF #### 下邊的代碼是跳轉用的,如果不想使用反向 Proxy可以用下邊的代碼取代上邊的 # 產生apache虛擬機器主機設定檔(跳轉) #echo "<VirtualHost *:80>">> $HTTPD_CONF #echo " ServerName www.$1">> $HTTPD_CONF #echo " ServerAlias $1">> $HTTPD_CONF #echo " Redirect / http://$1.demo.upall.cn/">> $HTTPD_CONF #echo "</VirtualHost>">> $HTTPD_CONF |
Windows使用者的解決辦法
可以使用plink.exe實現這個功能,樣本:
代碼如下 |
複製代碼 |
1 plink -pw yourPassword root@123.123.123.123 -P 23 doSomething.sh |
<完>
該功能會加到這個指令碼這裡:。
深入一點點:
從表面上簡單的理解一下登入的過程,
首先 ssh-keygen -t rsa 命令產生了一個密鑰和一個公開金鑰, 而且密鑰可以設定自己的密碼
可以把密鑰理解成一把鑰匙, 公開金鑰理解成這把鑰匙對應的鎖頭,
把鎖頭(公開金鑰)放到想要控制的server上, 鎖住server, 只有擁有鑰匙(密鑰)的人, 才能開啟鎖頭, 進入server並控制
而對於擁有這把鑰匙的人, 必需得知道鑰匙本身的密碼,才能使用這把鑰匙 (除非這把鑰匙沒設定密碼), 這樣就可以防止鑰匙被了配了(私密金鑰被人複製)
當然, 這種例子只是方便理解罷了,
擁有root密碼的人當然是不會被鎖住的, 而且不一定只有一把鎖(公開金鑰), 但如果任何一把鎖, 被人用其對應的鑰匙(私密金鑰)開啟了, server就可以被那個人控制了
所以說, 只要你曾經知道server的root密碼, 並將有root身份的公開金鑰放到上面, 就可以用這個公開金鑰對應的私密金鑰"開啟" server, 再以root的身分登入, 即使現在root密碼已經更改!
如果想控制n個機器, 那就需要n對鑰匙(密鑰和公開金鑰), ssh-keygen 命令可以隨意更改鑰匙對的名字, 比如:
代碼如下 |
複製代碼 |
[root@wwy .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa_192.168.102.12 ...... |
這樣私密金鑰和公開金鑰的名字分別就是:
id_rsa_192.168.102.12 和 id_rsa_192.168.102.12.pub
然後將 id_rsa_192.168.102.12.pub 檔案的內容, 追加到sever的 ~/.ssh/authorized_keys2 檔案中,
最後, 在本地用ssh命令的 -i 參數指定本地密鑰, 並登入:
# ssh -i /root/.ssh/id_rsa_192.168.102.12 192.168.102.12
如果密鑰設定了密碼, 就用密鑰的密碼登入, 沒設密碼, 就直接登入進去了
scp也是一樣的
如:
scp -i /root/.ssh/id_rsa ./xxx 192.168.102.158:/home/wwy/bak
這種不需密碼的不安全,下面看一個更安全的
首先產生一個新的ssh金鑰組
代碼如下 |
複製代碼 |
[guo@guo zuo]$ ssh-keygen -f id_ras -t rsa Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in id_ras. Your public key has been saved in id_ras.pub. The key fingerprint is: 17:ca:c3:37:8f:60:86:42:d0:0d:b7:4d:70:a1:b2:a3 guo@guo The key's randomart image is: +--[ RSA 2048]----+ | ...oo.+. | | ....* | | o o . . | | . o + . . | | + . S + | | . o o = + | | E . . | | | | | +-----------------+ |
當程式詢問密碼時按【enter】鍵,表示不設密碼,此時會在工作目錄中產生私密金鑰,密碼檔案名稱為is_rsa,以及公開金鑰檔案id_psa.pub。
[guo@guo zuo]$ ls id*
id_ras id_ras.pub
接下來把一個公開金鑰複製到遠程主機
代碼如下 |
複製代碼 |
[guo@guo zuo]$ ssh-copy-id root@222.24.21.61 root@222.24.21.61's password: Now try logging into the machine, with "ssh 'root@222.24.21.61'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. 這一次需要輸入密碼。但是以後就不用再輸入密碼了。 [guo@guo zuo]$ ssh-copy-id root@222.24.21.61 root@222.24.21.61's password: Now try logging into the machine, with "ssh 'root@222.24.21.61'", and check in: .ssh/authorized_keys to make sure we haven't added extra keys that you weren't expecting. 接下來執行指令碼。 [guo@guo zuo]$ cat guossh.sh #!/bin/sh ssh root@222.24.21.61 [guo@guo zuo]$ sh guossh.sh Last login: Sun Nov 13 20:28:30 2011 from 222.24.21.61 [root@guo ~]# |
現在已經登入上了。