Linux下实现SSH免密码登录和实现秘钥的管理、分发、部署SHELL脚本分享

环境:

ssh server: 192.168.100.29  server.example.com
ssh client: 192.168.100.30  client.example.com

通过root用户建立秘钥认证实现SHELL脚本管理,分发,部署

首先client端创建秘钥对,并将公钥分发给需要登录的SSH服务端

注:公钥相当于锁,私钥相当于钥匙,我们这里相当于在客户端创建一对钥匙和锁,想要做到SSH免密码登录,就相当于我们将锁分发到服务端并装锁,然后客户端就可以利用钥匙开锁。

一.建立秘钥认证

1.在客户端创建秘钥对:(ssh client)

代码如下:

# su - root
# ssh-keygen -t dsa

一路回车即可

代码如下:

Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
e9:5e:4a:7f:79:64:c5:ae:f2:06:a7:26:e4:41:5c:0e root@zabbix.example.com
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|          E .    |
|         . +   . |
|         .o .   o|
|        S.     o |
|       .  o . + .|
|        oo.. B . |
|       o +o * +  |
|        o .+ =.  |
+-----------------+

2.查看生成的秘钥对:(ssh client)

代码如下:

# ls -lda .ssh
-----------------
drwx------ 2 root root 4096 6月   6 23:03 .ssh
-----------------
# cd .ssh
# ls -la
------------------
总用量 16
drwx------   2 root root 4096 6月   6 23:03 .
dr-xr-x---. 26 root root 4096 6月   6 23:03 ..
-rw-------   1 root root  668 6月   6 23:03 id_dsa
-rw-r--r--   1 root root  613 6月   6 23:03 id_dsa.pub
------------------

秘钥生成完毕

3.将公钥(锁)分发到SSH服务端:(ssh client)

代码如下:

# ssh-copy-id -i .ssh/id_dsa.pub 192.168.100.29

注:若非root用户,以及自定义SSH端口,则格式为:

代码如下:

# ssh-copy-id -i .ssh/id_rsa.pub "-p 22 user@server"

输入yes,然后密码后回车:

代码如下:

The authenticity of host '192.168.100.30 (192.168.100.30)' can't be established.
RSA key fingerprint is fc:9b:2e:38:3b:04:18:67:16:8f:dd:94:a8:bd:08:03.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.30' (RSA) to the list of known hosts.
Address 192.168.100.30 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
root@192.168.100.30's password:
Now try logging into the machine, with "ssh '192.168.100.30'", and check in:
 .ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

公钥分发完毕

4.服务端查看收到的分发文件:(ssh server)

代码如下:

# ll /root/.ssh
-------------
总用量 4
-rw------- 1 root root 613 6月   6 23:29 authorized_keys
-------------

成功收到

5.客户端验证登陆:(ssh client)
查看服务端IP地址:

代码如下:

# ssh 192.168.100.29 /sbin/ifconfig eth0
-----------------------
Address 192.168.100.29 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
eth0      Link encap:Ethernet  HWaddr 00:0C:29:7A:4F:30 
         inet addr:192.168.100.29  Bcast:192.168.100.255  Mask:255.255.255.0
         inet6 addr: fe80::20c:29ff:fe7a:4f30/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:184297 errors:0 dropped:0 overruns:0 frame:0
         TX packets:162028 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:163599380 (156.0 MiB)  TX bytes:51284830 (48.9 MiB)
         Interrupt:19 Base address:0x2000

注:这里遇到警告提示“Address 192.168.100.29 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!”。
解决办法为修改客户端/etc/hosts文件,将服务端的ip地址与主机名对应关系写进去就可以了。

代码如下:

(ssh client)
# echo "192.168.100.29  server.example.com" >> /etc/hosts

重新查看

代码如下:

# ssh 192.168.100.29 /sbin/ifconfig eth0

无错误提示:

代码如下:

--------------------------
eth0      Link encap:Ethernet  HWaddr 00:0C:29:7A:4F:30 
         inet addr:192.168.100.29  Bcast:192.168.100.255  Mask:255.255.255.0
         inet6 addr: fe80::20c:29ff:fe7a:4f30/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:184530 errors:0 dropped:0 overruns:0 frame:0
         TX packets:162264 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:163618650 (156.0 MiB)  TX bytes:51304877 (48.9 MiB)
         Interrupt:19 Base address:0x2000
---------------------------

查看服务端内存

代码如下:

# ssh 192.168.100.29 free -m
--------------------------
            total       used       free     shared    buffers     cached
Mem:          1006        991         14          0        177        308
-/+ buffers/cache:        506        500
Swap:         1023          6       1017
---------------------------

二.创建SHELL脚本实现批量管理:(ssh client)
1.创建脚本:

代码如下:

# cd /etc/rc.d
# vi manager.sh
------------------
for ip in `cat iplist`
do
  echo "---$ip---"
  ssh $ip $1
done
------------------

2.生成IP列表:(若有多台SSH服务端需要管理,这里以此类推即可)

代码如下:

# echo 192.168.100.29 >> iplist
# echo 192.168.100.28 >> iplist
。。。。。
# cat iplist
---------------
192.168.100.29
---------------

3.执行脚本:

代码如下:

# sh manager.sh "df -h"
----------------
---192.168.100.29---
文件系统              容量  已用  可用 已用%% 挂载点
/dev/sda3              19G  6.7G   11G  38% /
tmpfs                 504M     0  504M   0% /dev/shm
/dev/sda1             194M   27M  158M  15% /boot
----------------

管理成功

三.创建SHELL脚本实现批量分发:(ssh client)

1.创建脚本:

代码如下:

# cd /etc/rc.d
# vi distribute.sh
------------------
for ip in `cat iplist`
do
  echo "---$ip---"
  scp -r -p $1 $ip:$2
done
------------------

脚本IP列表已创建
执行脚本:
将本地/root下文件分发到SSH服务端主机

代码如下:

# sh distribute.sh /root /tmp
------------------
---192.168.100.29---
.ICEauthority                                 100%  620     0.6KB/s   00:00   
install.log.syslog                            100%   10KB  10.2KB/s   00:00   
preferred-web-browser.desktop                 100% 2378     2.3KB/s   00:00   
preferred-mail-reader.desktop                 100%  257     0.3KB/s   00:00   
.converted-launchers                          100%    0     0.0KB/s   00:00   
.bash_history                                 100% 3200     3.1KB/s   00:00   
.bash_logout                                  100%   18     0.0KB/s   00:00   
applet_dirlist                                100%    0     0.0KB/s   00:00   
saved_state                                   100%   65KB  64.5KB/s   00:00   
8f329b0c645a51e018b765fa0000001a-0            100%  463     0.5KB/s   00:00   
............
------------------

分发成功

四.批量部署:

这里的部署就结合了SHELL脚本批量管理和分发两个功能。
比如你要部署N台SSH服务端批量安装APACHE。

1.写好APACHE安装脚本。
2.将安装脚本分发到SSH服务端。
3.利用SHELL管理远端执行该脚本即可。
这里就不做过多演示,有机会我整理下我的LAMP文档,写个APACHE脚本,在这里演示下。
注:因为涉及风险操作。所以不推荐线上利用root用户进行批量管理操作。
建议设置普通账户,再利用sudo提权操作。

通过普通用户建立秘钥认证并sudo提权进行管理,分发,部署

代码如下:

(ssh server)
# useradd user02
# echo "123456" | passwd --stdin user02
(ssh client)
# useradd user01
# echo "123456" | passwd --stdin user01
# su - user01
# ssh-keygen -t dsa

注:默认三个回车完成创建

代码如下:

# ssh-copy-id -i .ssh/id_dsa.pub user02@192.168.100.29

输入密码123456,分发完毕
验证:

代码如下:

# ssh user02@192.168.100.29 /sbin/ifconfig eth0

返回192.168.100.29端IP即表明秘钥验证成功。
分发:
注:客户端user01用户现在可以免密码分发到服务端user02所属文件夹,但若想分发到root所属文件夹,则需要sudo提权。
1.服务端sudo提权:

代码如下:

# su - root
# echo "user02 ALL=(ALL) NOPASSWD:/usr/bin/rsync,/bin/tar,/usr/bin/scp,/bin/cp" >> /etc/sudoers

登录user02账户

代码如下:

# su - user02

查看账户信息:

代码如下:

# sodo -l
----------------
............
User user02 may run the following commands on this host:
   (ALL) NOPASSWD: /usr/bin/rsync, (ALL) /bin/tar, (ALL) /usr/bin/scp,(ALL) /bin/cp
----------------

2.客户端先分发到服务端user02用户家目录:

代码如下:

# scp -P22 -r -p /home/user01/ user02@192.168.100.29:/home/user02
-----------------------------
.bash_logout                                  100%   18     0.0KB/s   00:00   
.bashrc                                       100%  124     0.1KB/s   00:00   
known_hosts                                   100%  396     0.4KB/s   00:00   
id_dsa                                        100%  672     0.7KB/s   00:00   
id_dsa.pub                                    100%  615     0.6KB/s   00:00   
.bash_profile                                 100%  176     0.2KB/s   00:00 
-------------------------------

2.连接服务端后执行sudo cp命令执行本地拷贝:

代码如下:

# ssh -t user02@192.168.100.29 sudo cp /home/user02 /etc
-----------------------
Connection to 192.168.100.29 closed.
-----------------------

拷贝成功
注:

代码如下:

# cp /test1 /test2/

是将/test1目录拷贝到/test2/目录下

代码如下:

# cp /test1/ /test2/

是将/test1目录下的所有文件拷贝到/test2/目录下
-------大功告成--------

(0)

相关推荐

  • Linux下实现免密码登录(超详细)

    1.Linux下生成密钥 ssh-keygen的命令手册,通过"man ssh-keygen"命令: 通过命令"ssh-keygen -t rsa" 生成之后会在用户的根目录生成一个 ".ssh"的文件夹 进入".ssh"会生成以下几个文件 authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥 id_rsa : 生成的私钥文件 id_rsa.pub : 生成的公钥文件 know_hosts

  • Linux下交互式与非交互式修改用户密码的例子

    最近管理的一批机器,有个需求是要统一修改一个帐号的用户名密码,比如将qa帐号的密码改为1234,后来还为了脚本化,很方便的执行,还使用了非交互式地修改用户的密码.简单记录一下吧. 1. 交互式配置本地用户的密码:passwd 命令 复制代码 代码如下: [root@host_221-81 ~]# passwd qa Changing password for user qa. New password: BAD PASSWORD: it is too short BAD PASSWORD: is

  • linux mysql忘记密码的多种解决或Access denied for user 'root'@'localhost'

    我的系统是ubuntu6.06,最近新装好的mysql在进入mysql工具时,总是有错误提示: # mysql -uroot -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 使用网上介绍的方法修改root用户的密码: # mysqladmin -uroot -p password 'newpassword' Enter password: m

  • Linux密码安全防护操作详解

    在之前写了Linux密码破解的方法,虽然这样对于忘记密码时很方便,但同时别人也可以很轻易的破解你的Liunx虚拟机,安全问题存在隐患. 下面给出一些Liunx密码的安全防护操作: 1.防止破解root密码(设置boot密码) 之前已经了解到了破解root密码的方法,其实就是进入boot的单用户模式对root密码进行修改,那么只要对boot设置一个密码,其他人就不能随便进入你的boot项,修改你的密码了. 对boot设置密码的方法: (1)在CentOS6.5中,右击桌面,点击"在终端中打开&qu

  • Linux用户在第一次登录时强制更改初始密码

    下面介绍如何迫使用户在下一次登录时更改其密码. Linux下的每个用户帐户都与和密码相关的各个配置和信息关联起来.比如说,它记得上一次密码更改的日期.密码更改间隔的最少/最多天数以及何时让当前密码到期失效,等等. 一种名为chage的命令行工具可以访问和调整与密码到期失效有关的配置.你可以使用该工具,迫使任何用户在下一次登录时更改密码. 想查看某一个用户(比如alice)的密码到期失效信息,运行下面这个命令.请注意:只有在你检查你自己之外的其他任何用户的密码有效期信息时,才需要根用户权限. $

  • Linux VPS利用SSH重置ROOT密码的方法

    鉴于我们的VPS安全性,老左建议大家为了维护VPS的安全性,也有必要在一段时间修改ROOT密码.VPS管理平台用户后台如果没有修改ROOT密码,也不要紧,我们可以利用SSH直接修改,一个单词命令就可以完成.只需要两步就可以完成. 第一步,登录我们的SSH,一般老左喜欢用PUTTY软件直接登录,这个我相信大家不要我再截图给大家看了吧. 第二步,用root用户名和密码登录. 输入"passwd"命令回车后然后会提示我们输入新密码,然后回车再输入一次.回车后我们就设置完毕,以后我们就用新的R

  • python实现linux服务器批量修改密码并生成execl

    批量修改linux服务器密码,同时生成execl表格 复制代码 代码如下: #!/usr/bin/env python#coding:utf8#随机生成自定义长度密码from random import choiceimport string,pickle def GenPassword(length=8,chars=string.ascii_letters+string.digits):    return ''.join([choice(chars) for i in range(lengt

  • 重置MySQL数据库root密码(linux/windows)

    (1)Linux系统 在SSH中执行下面的命令即可将MySQL密码重置为diavps 复制代码 代码如下: rm -f reset-mysql-root-password.phps wget http://down.hostwiki.info/mysql/reset-mysql-root-password.phps php reset-mysql-root-password.phps diavps 注意不要在带有管理面板(如Kloxo或DA)的环境中使用这个方法重置. 脚本中第13行中的以安全模

  • linux修改root密码和linux忘记root密码后找回密码的方法

    以root身份登陆,执行: 复制代码 代码如下: # passwd 用户名 (修改密码)# useradd 用户名 (添加用户) 具体示例如下: 复制代码 代码如下: [root@bogon ~]# passwd rootChanging password for user root.New UNIX password:BAD PASSWORD: it is based on a dictionary wordRetype new UNIX password:passwd: all authen

  • Linux 入门常用命令 password — 修改密码,改变用户

    passwd命令 出于系统安全考虑,Linux系统中的每一个用户除了有其用户名外,还有其对应的用户口令.因此使用useradd命令增加时,还需使用passwd命令为每一位新增加的用户设置口令:用户以后还可以随时用passwd命令改变自己的口令. 该命令的一般格式为: passwd [用户名] 其中用户名为需要修改口令的用户名.只有超级用户可以使用"passwd 用户名"修改其他用户的口令,普通用户只能用不带参数的passwd命令修改自己的口令. 该命令的使用方法如下: 输入 passw

随机推荐