ssh

 

查看软件

[root@backup ~]# rpm -qa openssh openssl
openssl-1.0.1e-30.el6.x86_64      #加密
openssh-5.3p1-104.el6.x86_64      #连接

查看服务,0.0.0.0 监听所有IP端口

[root@backup ~]# netstat -nlpt|grep sshd
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      876/sshd            
tcp        0      0 :::22                       :::*                        LISTEN      876/sshd  

给一个端口,查看是什么服务

[root@backup ~]# lsof -i:22
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd      876 root    3u  IPv4   9529      0t0  TCP *:ssh (LISTEN)
sshd      876 root    4u  IPv6   9531      0t0  TCP *:ssh (LISTEN)
sshd    29096 root    3u  IPv4  47577      0t0  TCP 192.168.88.10:ssh->192.168.88.1:60895 (ESTABLISHED)
sshd    31319 root    3u  IPv4  59030      0t0  TCP 192.168.88.10:ssh->192.168.88.1:55402 (ESTABLISHED)
sshd    31929 root    3r  IPv4  63186      0t0  TCP 192.168.88.10:ssh->192.168.88.1:65234 (ESTABLISHED)

第二种

[root@backup ~]# netstat -nlpt|grep 22
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      876/sshd            
tcp        0      0 :::22                       :::*                        LISTEN      876/sshd          

配置文件

/etc/ssh/sshd_config

 修改前先备份

[root@backup ssh]# cp sshd_config{,.bak}

优化

Port 12321               #修改端口
ListenAddress 192.168.88.10    #指定监听端口
PermitEmptyPasswords no       #不允许空密码用户登录 PermitRootLogin no          #不允许root用户直接登录,可以su - root GSSAPIAuthentication no       # UseDNS no               #不使用DNS,对主机名进行反向解析

平滑重启

[root@backup ssh]# /etc/init.d/sshd reload
Reloading sshd:                                            [  OK  ]

ssh客户端的使用

[root@lvs1 ~]# ssh -p22 root@192.168.88.10

p   小写指定端口,不写默认为22,root@192.168.88.10 root用户名,@后面为服务器IP,ssh -p22 192.168.88.10 默认root用户

故障排查

[root@lvs1 ~]# ssh -p22 root@192.168.88.10 
ssh: connect to host 192.168.88.10 port 22: Connection refused

1、防火墙问题。

2、对方改端口了。

3、对方sshd服务没有启动。

不通连接不上问题

1、防火墙问题。

2、ssh服务问题。

3、/etc/hosts加入访问控制。

4、是否启用不让密码登录。

 scp 远程拷贝

 拷贝文件,全量拷贝

[root@lvs1 ~]# scp -P22  /etc/hosts root@192.168.88.10:/tmp
root@192.168.88.10's password: 
hosts                                                                                                                                                      100%  158     0.2KB/s   00:00 
[root@backup ~]# ls /tmp/
hosts

-P               大写P指定端口

/etc/hosts            本地文件

root@192.168.88.10:/tmp   对方tmp目录下

拷贝目录

[root@lvs1 ~]# scp -P22  -rp /etc root@192.168.88.10:/tmp
[root@backup ~]# ls /tmp/
etc  hosts

-r 拷贝目录,-p保持文件属性,可以使用-l限速

远端拉取数据

[root@lvs1 ~]# scp -P22  -rp  root@192.168.88.10:/tmp/etc /root/

ssh免密码登录

 

创建用户及密码

[root@backup ~]# useradd wxianj
[root@backup ~]# echo "123456"|passwd --stdin wxianj
Changing password for user wxianj.
passwd: all authentication tokens updated successfully.
[root@backup ~]# id wxianj
uid=501(wxianj) gid=501(wxianj) groups=501(wxianj)

两个客户端也创建用户

切换用户

[root@backup ~]# su - wxianj
[wxianj@backup ~]$ 

创建密钥对

[wxianj@backup ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/wxianj/.ssh/id_dsa): 
Created directory '/home/wxianj/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/wxianj/.ssh/id_dsa.
Your public key has been saved in /home/wxianj/.ssh/id_dsa.pub.
The key fingerprint is:
a0:2d:89:75:06:37:6c:51:0a:0e:dd:92:a6:8a:bd:50 wxianj@backup
The key's randomart image is:
+--[ DSA 1024]----+
|  ..o++o.        |
|   o=++o         |
|   ooo=          |
|  Eo * .         |
|.+. + . S        |
|+ .  .           |
| . .             |
|  .              |
|                 |
+-----------------+

注:一键生成密钥对

[wxianj@backup ~]$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa>/dev/null 2>&1

查看,id_dsa私钥,id_dsa.pub公钥

[wxianj@backup ~]$ ls .ssh/
id_dsa  id_dsa.pub

拷贝公钥到目标机器

[wxianj@backup ~]$ ssh-copy-id -i .ssh/id_dsa.pub wxianj@192.168.88.6
The authenticity of host '192.168.88.6 (192.168.88.6)' can't be established.
RSA key fingerprint is f2:d6:44:06:6b:06:25:1d:ff:d7:3f:36:36:72:6a:b8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.88.6' (RSA) to the list of known hosts.
wxianj@192.168.88.6's password: 
Now try logging into the machine, with "ssh 'wxianj@192.168.88.6'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

查看

[wxianj@lvs2 ~]$ ls -l .ssh/
total 4
-rw------- 1 wxianj wxianj 603 May 23 02:11 authorized_keys

同理5也拷贝,如果对方不是22端口,需要-p参数指定端口

[wxianj@backup ~]$ ssh-copy-id -i .ssh/id_dsa.pub "-p22 wxianj@192.168.88.5"

测试

[wxianj@backup ~]$ ssh -p22 wxianj@192.168.88.5
[wxianj@lvs1 ~]$ 
[wxianj@backup ~]$ ssh wxianj@192.168.88.6
[wxianj@lvs2 ~]$ 

远程执行命令,多个需要分号

[wxianj@backup ~]$ ssh wxianj@192.168.88.5 'pwd;who'
/home/wxianj
root     pts/0        2017-05-25 09:33 (192.168.88.1)

企业

[wangxj@lvs ~]$ which sshp
alias sshp='sudo ssh -p12321'
    /usr/bin/sudo

scp权限问题

[wxianj@backup ~]$ scp /etc/hosts wxianj@192.168.88.5:/etc/hosts
scp: /etc/hosts: Permission denied

企业实现ssh权限方法

1、直接root ssh key,允许root登录。

2、sudo提权,实现没有权限的用户拷贝。

    先拷贝对方家目录,然后sudo提权cp或rsync拷贝到目标位置。

[root@lvs1 ~]# visudo
wxianj  ALL=(ALL)       NOPASSWD: /bin/cp

测试

[root@lvs1 ~]# tail -1 /etc/hosts
1.1.1.1     aaa
[wxianj@backup ~]$ scp /etc/hosts wxianj@192.168.88.5:~
hosts  
[wxianj@backup ~]$ ssh wxianj@192.168.88.5 sudo cp ~/hosts /etc/hosts
sudo: sorry, you must have a tty to run sudo
[wxianj@backup ~]$ ssh -t wxianj@192.168.88.5 sudo cp ~/hosts /etc/hosts   #远程sudo要加-t参数
Connection to 192.168.88.5 closed.
[root@lvs1 ~]# tail -1 /etc/hosts
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

ssh实现批量分发

[wxianj@backup ~]$ vim fenfa.sh 


. /etc/init.d/functions

if [ $# -ne 2 ]
then
    echo "USAGE:$0 must two args"
    exit 1
fi

for i in 5 6
do
    scp -P22 -r ~/$1 wxianj@192.168.88.$i:~ >/dev/null 2>&1 &&\
    ssh -t wxianj@192.168.88.$i sudo cp ~/$1 $2 >/dev/null 2>&1
   if [ $? -eq 0 ]
   then
       action "fenfa $1 192.168.88.$i" /bin/true
   else
       action "fenfa $1 192.168.88.$i" /bin/true
    fi
done

两个参数,-o ConnectTimeout=3 ssh连接卡死,timeout(脚本中使用有问题?)可以实现当一个命令在规定时间内不返回就强制返回的功能

rsync结合ssh免秘钥使用(增量、加密)

[wxianj@backup ~]$ rsync -avz fenfa.sh -e "ssh -p22" wxianj@192.168.88.5:~
sending incremental file list
fenfa.sh

sent 150 bytes  received 31 bytes  362.00 bytes/sec
total size is 91  speedup is 0.50

对端查看

[wxianj@lvs1 ~]$ ls
fenfa.sh  hosts

其他

多个主机连接一台服务器

B--->A

C--->A

1、主机A生成私钥然后分发给B和C

2、B和C分别生成公钥,然后ssh-copy-id到A,两台都执行相同的命令,会自动追加到对方authorized_keys文件中(推荐)

企业应用

系统初始化时直接写到.ssh/authorized_keys文件中(权限问题)

例:

[wxianj@lvs1 ~]$ echo "ssh-dss ACCCB3NzaC1kc3MAAACBAP4W0q9YdxrI5nz/Tjlvv0fO7UtFB8hHV/X/RnGORkMVyXlQNsJv4hRVeP8PCUOF5jbJTO/U6Zj9NfYwgECzGlhqscPAWgcmf8RfB+ZVex8lslAJkThpp0z6NT0cZFhrlTD2XgauzoRhoaEZKaUF3l5tNI0fhHV+Sk1reo2cJjuvAAAAFQCFkgzUPNhD/CEWl1HgKofcLUvPRwAAAIAmXAOT+I83fo/Fi5YTYjFjQf3vxdEDrL0J1NJ4XHNLi7ZwERY2lV4FQ4G1Zjc5y8VMUALF7zGPt9e9GPDra63ay4cE4JpZp60quKlnb9ZingapBmjwEv1OIUBQIlYcV9jDmrZnM9sN5FrhCDGi35ZVlJywQy43GvMwcT+OnVTsbAAAAIEAx3poWiLy70rgW3imoJ8A22ymUatcXF5/z/WMMZwYiFYlLQusQs7SPX86Re7+Z2W7QOQ8kn9lhncpi26TkuoQjO23LBaAE6zEIv4j1yM6MTSc7TF8EG92nA8ow3g2whe++sgHG9duToYoNla8C0mQIujyz3ykVAxcCQgmsEBKLcg= wxianj@backup">.ssh/authorized_keys

except 

Expect是一个用来实现自动交互功能的软件套件

[root@backup ~]# rpm -qa expect
[root@backup ~]# yum install expect -y
[root@backup ~]# rpm -qa expect
expect-5.44.1.15-5.el6_4.x86_64

1、首行加上/usr/bin/expect

2、spawn: spawn命令是expect的初始命令,它用于启动一个进程,之后所有expect操作都在这个进程中进行,如果没有spawn语句,整个expect就无法执行了,如:spawn ssh root@192.168.2.5

3、expect: expect 表达式 动作 表达式 动作。。。,只有spawn 执行的命令结果才会被expect 捕捉到,主要包括:标准输入的提示信息,eof 和timeout。

4、send 和send_user:send 会将expect 脚本中需要的信息发送给spawn 启动的那个进程,而send_user 只是回显用户发出的信息,类似于shell 中的echo 而已。

set 设置变量值

expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

interact 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

set timeout 30

设置超时时间,计时单位是:秒。timeout -1 为永不超时

send:用于向进程发送字符串

expect:从进程接收字符串

spawn:启动新的进程

interact:允许用户交互

[lrange $argv 0 0]表示第1个参数,[lrange $argv 0 4]为第一个到第五个参数

例:

[wxianj@backup ~]$ vim ssh_expect.exp 

#!/usr/bin/expect
spawn su - root
expect "Password: "
send "fastweb\n"
expect "*#"
interact

执行脚本不能用ssh,可以用./或者 expect

[wxianj@backup ~]$ expect ssh_expect.exp 
spawn su - root
Password: 
[root@backup ~]# 

例:

[root@backup ~]# cat ssh.exp 
#!/usr/bin/expect
spawn ssh root@192.168.88.5
expect {
"(yes/no)?" { send "yes\r";exp_continue}
"password:" { send "fastweb\r"}
}
expect "]*"    #捕捉]#或者]$
send "ls \n"
expect "]*"
send "ip a\n"
expect "]*"
send "exit\r"
expect eof
exit

expect 命令还有一种用法,它可以在一个expect匹配中多次匹配关键字,并给出处理动作,只需要将关键字放在一个大括号就可以了,当然还有exp_continue.

[root@backup ~]# expect ssh.exp 
spawn ssh root@192.168.88.5
root@192.168.88.5's password: 
Last login: Tue May 23 07:15:02 2017 from 192.168.88.10
[root@lvs1 ~]# ls 
anaconda-ks.cfg  etc  install.log  install.log.syslog
[root@lvs1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:67:cc:02 brd ff:ff:ff:ff:ff:ff
    inet 192.168.88.5/24 brd 192.168.88.255 scope global eth1
    inet 192.168.88.8/24 scope global secondary eth1:1
    inet6 fe80::20c:29ff:fe67:cc02/64 scope link 
       valid_lft forever preferred_lft forever
[root@lvs1 ~]# exit
logout
Connection to 192.168.88.5 closed.
[root@backup ~]# 
#!/usr/bin/expect
#参数的数目可以用$argc 得到
if { $argc != 2 } {
  send_user "usage:expect scp-expect.exp file host dir\n"
exit
}
 set ip [lindex $argv 0 ]                     #接收第一个参数,并设置IP,n从0开始,分别表示第一个,第二个,第三个....参数  
 set password [lindex $argv 1 ]               #接收第二个参数,并设置密码  
 set timeout 10                               #设置超时时间  
 spawn ssh root@$ip                           #发送ssh请滶  
 expect {                                     #返回信息匹配  
 "*yes/no" { send "yes\r"; exp_continue}      #第一次ssh连接会提示yes/no,继续  
 "*password:" { send "$password\r" }          #出现密码提示,发送密码  
 }  
 interact                                      #交互模式,用户会停留在远程服务器上面.  

expect批量分发,免交互脚本示例

主要有两部分:fenfa_sshkey.exp和fenfa.sh ,使用时直接执行fenfa.sh即可

root@server_05 scripts]# cat 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"           ##分发帐号的密码
set user "fenfa"                  ##分发帐号
set port "52113"                ##分发主机的ssh端口
spawn ssh-copy-id -i  $file  "-p  $port  $user@$host"
expect {
        "yes/no"    {send "yes\r";exp_continue}
        "*password" {send "$password\r"}
}
expect eof
[root@server_05 scripts]# cat fenfa.sh 
#!/bin/bash
Ipaddr_head=192.168.1
User=fenfa
Port=52113
Commond_dir=/usr/bin
if [ $UID -ne 0 ]
  then 
   echo "Error:Please use root account to exec this script!"
 else
   for n in `seq 5`
      do
      ${Commond_dir}/ssh-copy-id -i "-p $Port ${User}@${Ipaddr_head}.$n" &2>/dev/null
      if [ $? -eq 0  ] 
        then
           action "${Ipaddr_head}$n copy ssh_key..."  /bin/ture
        else
            action "${Ipaddr_head}$n copy ssh_key..."  /bin/false
      fi
   done
fi

 

posted @ 2017-05-29 11:11  wxianj  阅读(230)  评论(0)    收藏  举报