SSH广泛用于脚本自动化。借助SSH,我们可以在远程主机上执行命令并读取输出。SSH使用用户名和密码进行认证。在SSH命令的执行过程中提示输入密码。但是在自动化脚本中,SSH命令可能在一个循环中执行上百次,每次都得提供密码的话,显然不实际。因此,我们需要将登入过程自动化。SSH就包含了一个内建的特性,可以用SSH密钥实现自动登陆。这则攻略描述了如何创建SSH密钥并协助实现自动登陆。
SSH采用基于公钥和基于私钥的加密技术进行自动化认证。认证密钥包含两部分:一个公钥和一个私钥。我们可以通过“ssh-keygen”命令创建认证密钥。要想实现自动化认证,公钥必须放置在服务器中(将其加入文件~/.ssh/authorized_keys),与公钥对应的私钥应该放入你用来登录的客户机的~/.ssh目录中。另一些与SSH相关的配置信息(例如,authorized_keys文件的路径与名称)可以通过修改文件/etc/ssh/sshd_config进行配置。
设置SSH自动化认证步骤:
1. 创建SSH密钥,这需要登录到远程主机
2. 将生成的密钥传输到远程主机,并将其加入文件~/.ssh/authorized_keys中
要创建SSH密钥,输入命令ssh-keygen,并规定加密算法类型为RSA:
点击(此处)折叠或打开
renzo@renzo:/home/renzo> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/renzo/.ssh/id_rsa): /home/renzo/.ssh/id_rsa
Created directory '/home/renzo/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/renzo/.ssh/id_rsa.
Your public key has been saved in /home/renzo/.ssh/id_rsa.pub.
The key fingerprint is:
cc:5d:af:7b:8b:20:08:67:6a:71:79:9d:54:6c:31:78 renzo@renzo
The key's randomart image is:
+--[ RSA 2048]----+
| o+. |
| ..E. |
| .o. |
| + + o . |
| o = S + . |
| B o . |
| o . . . . |
| . . . o. |
| o... |
+-----------------+
这时会提示输入一个口令来生。成一对公钥和私钥。如果不输入口令的话,也可以生成密钥,但是这种做法是一种不安全的行为。我们可以编写监控脚本,利用自动登录来登入多台主机。对于这种情况,在运行ssh-keygen命令时,不要填入口令,这样就能够避免在脚本运行时向你索要口令了。
现在~/.ssh/id_rsa.pub和~/.ssh/id_ras已经生成了。id_rsa.pub是生成的公钥,id_ras是生成的私钥。公钥必须添加到远程服务器~/.ssh/authorized_keys文件中,这台服务器也就是我们想从当前主机自动登入的那台服务器。
要添加一个密钥,可以使用:
$ ssh USER@REMOTE_HOST "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
上面的命令要设定登录密码。
这样一来,自动登录就设置好了。从现在开始,SSH在运行过程中就不会再提示输入密码,完成自动登录了。
在编写脚本之前,请先安装yum install expect -y
1.编写服务器免交互生成公钥、私钥
[lx888@C ~]$ vim ssh-keygen.exp
#!/usr/bin/expect
#set enter "\n"
spawn ssh-keygen -t dsa
expect {
"*(/home/lx888/.ssh/id_dsa)" {send "\n\r";exp_continue}
"*(empty for no passphrase)" {send "\n\r";exp_continue}
"*again" {send "\n\r"}
}
expect eof
2.编写批量分发公钥到各个服务器,并免密钥认证
[lx888@C ~]$ vim fenfa_sshkey.sh
#!/bin/sh
expect ssh-keygen.exp &>/dev/null
. /etc/init.d/functions
for ip in 132 133
do
#expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.59.$ip >/dev/null 2>&1
expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.59.$ip &>/dev/null
if [ $? -eq 0 ];then
action "192.168.59.$ip" /bin/true
else
action "192.168.59.$ip" /bin/false
fi
done
[lx888@C ~]$ vim fenfa_sshkey.exp
#!/usr/bin/expect
if { $argc != 2 } {
send_user "usage: expect fenfa_sshkey.exp file host\n"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"
#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts
#spawn scp -P52113 $file oldboy@$host:$dir
#spawn ssh-copy-id -i $file "-p 52113 oldboy@$host"
spawn ssh-copy-id -i $file "-p 22 lx888@$host"
expect {
"yes/no" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
SSH采用基于公钥和基于私钥的加密技术进行自动化认证。认证密钥包含两部分:一个公钥和一个私钥。我们可以通过“ssh-keygen”命令创建认证密钥。要想实现自动化认证,公钥必须放置在服务器中(将其加入文件~/.ssh/authorized_keys),与公钥对应的私钥应该放入你用来登录的客户机的~/.ssh目录中。另一些与SSH相关的配置信息(例如,authorized_keys文件的路径与名称)可以通过修改文件/etc/ssh/sshd_config进行配置。
设置SSH自动化认证步骤:
1. 创建SSH密钥,这需要登录到远程主机
2. 将生成的密钥传输到远程主机,并将其加入文件~/.ssh/authorized_keys中
要创建SSH密钥,输入命令ssh-keygen,并规定加密算法类型为RSA:
点击(此处)折叠或打开
renzo@renzo:/home/renzo> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/renzo/.ssh/id_rsa): /home/renzo/.ssh/id_rsa
Created directory '/home/renzo/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/renzo/.ssh/id_rsa.
Your public key has been saved in /home/renzo/.ssh/id_rsa.pub.
The key fingerprint is:
cc:5d:af:7b:8b:20:08:67:6a:71:79:9d:54:6c:31:78 renzo@renzo
The key's randomart image is:
+--[ RSA 2048]----+
| o+. |
| ..E. |
| .o. |
| + + o . |
| o = S + . |
| B o . |
| o . . . . |
| . . . o. |
| o... |
+-----------------+
这时会提示输入一个口令来生。成一对公钥和私钥。如果不输入口令的话,也可以生成密钥,但是这种做法是一种不安全的行为。我们可以编写监控脚本,利用自动登录来登入多台主机。对于这种情况,在运行ssh-keygen命令时,不要填入口令,这样就能够避免在脚本运行时向你索要口令了。
现在~/.ssh/id_rsa.pub和~/.ssh/id_ras已经生成了。id_rsa.pub是生成的公钥,id_ras是生成的私钥。公钥必须添加到远程服务器~/.ssh/authorized_keys文件中,这台服务器也就是我们想从当前主机自动登入的那台服务器。
要添加一个密钥,可以使用:
$ ssh USER@REMOTE_HOST "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
上面的命令要设定登录密码。
这样一来,自动登录就设置好了。从现在开始,SSH在运行过程中就不会再提示输入密码,完成自动登录了。
在编写脚本之前,请先安装yum install expect -y
1.编写服务器免交互生成公钥、私钥
[lx888@C ~]$ vim ssh-keygen.exp
#!/usr/bin/expect
#set enter "\n"
spawn ssh-keygen -t dsa
expect {
"*(/home/lx888/.ssh/id_dsa)" {send "\n\r";exp_continue}
"*(empty for no passphrase)" {send "\n\r";exp_continue}
"*again" {send "\n\r"}
}
expect eof
2.编写批量分发公钥到各个服务器,并免密钥认证
[lx888@C ~]$ vim fenfa_sshkey.sh
#!/bin/sh
expect ssh-keygen.exp &>/dev/null
. /etc/init.d/functions
for ip in 132 133
do
#expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.59.$ip >/dev/null 2>&1
expect fenfa_sshkey.exp ~/.ssh/id_dsa.pub 192.168.59.$ip &>/dev/null
if [ $? -eq 0 ];then
action "192.168.59.$ip" /bin/true
else
action "192.168.59.$ip" /bin/false
fi
done
[lx888@C ~]$ vim fenfa_sshkey.exp
#!/usr/bin/expect
if { $argc != 2 } {
send_user "usage: expect fenfa_sshkey.exp file host\n"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"
#spawn scp /etc/hosts root@10.0.0.142:/etc/hosts
#spawn scp -P52113 $file oldboy@$host:$dir
#spawn ssh-copy-id -i $file "-p 52113 oldboy@$host"
spawn ssh-copy-id -i $file "-p 22 lx888@$host"
expect {
"yes/no" {send "yes\r";exp_continue}
"*password" {send "$password\r"}
}
expect eof
#########################################
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2201 root@127.0.0.1