Linux下实现免交互登陆一般有两种:

1. SSH无密码认证方式

客户端使用ssh-keygen生成密钥对,将公钥复制到服务端(authorized_keys),SSH提供公钥登陆,当SSH访问服务端时,服务端先在本机寻找客户端的公钥,然后把客户端发来的公钥进行比较,如果一致,则用公钥加密给客户端,客户端再用私钥进行解密,实现加密所有传输的数据。

1>.在客户机上创建密钥对

# ssh-keygen -t rsa #一路回车

2>.登陆ssh服务器,创建.ssh目录及设置权限

1
2
# mkdir /root/.ssh
# chmod 700 /root/.ssh

3>.将公钥上传到服务器并重命名为authorized.keys

1
# scp /root/.ssh/id_rsa.pub root@服务端IP:/root/.ssh/authorized_keys #id_rsa.pub可以追加多个客户端的公钥

4>.设置ssh服务器

1
2
3
4
5
6
# vi /etc/ssh/sshd_config 
RSAAuthentication yes           #这三行取消注释,开启密钥对验证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no    #关闭密码验证
# service sshd restart

5>.免交互登陆测试,并查看远程主机磁盘分区

1
# ssh root@服务端IP 'df -h'

2. 利用expect工具自动实现交互任务

Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

CentOS安装:yum install expect

Ubuntu安装:sudo apt-get install expect

1>.免交互登陆,查看远程主机磁盘分区

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/expect
set ip 192.168.1.156
set pass 123.com    
set timeout 30
spawn ssh root@$ip
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$pass\r"}
}
expect "root@*"  {send "df -h\r"}
expect "root@*"  {send "exit\r"}
expect eof
# interact

2>.在Shell脚本中嵌入Expect语法

方法1:使用EOF,将内容段让expect执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
user=root
pass='123'
ip='192.168.1.154'
/usr/bin/expect << EOF
set timeout 30
spawn ssh $user@$ip   
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$pass\r"}
}
expect "root@*"  {send "df -h\r"}
expect "root@*"  {send "exit\r"}
expect eof 
EOF

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
user=root
pass='123'
ip='192.168.1.154'
expect -c "
    spawn ssh $user@$ip
    expect {
        \"(yes/no)\" {send \"yes\r\"; exp_continue}
        \"password:\" {send \"$pass\r\"; exp_continue}
        \"root@*\" {send \"df -h\r exit\r\"; exp_continue}
    }"

方法2:将expect脚本独立出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# vi login.exp      #免交互登陆脚本
#!/usr/bin/expect 
set ipaddress [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
if { $argc != 3 } {
puts "Usage: expect login.exp ipaddress username password"
exit 1
}
set timeout 30
spawn ssh $username@$ipaddress
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$password\r"}
}
expect "$username@*"  {send "df -h\r"}
expect "$username@*"  {send "exit\r"}
expect eof

1
2
3
4
5
6
7
8
9
10
11
# vi user_info     #用户信息文件
192.168.1.156   user    user
192.168.1.154   root    123.com
# vi expect.sh     #读取用户信息并赋值到变量
#!/bin/bash
for ip in `awk '{print $1}' user_info`
do
    user=`awk -v I="$ip" '{if(I==$1)print $2}' user_info`
    pass=`awk -v I="$ip" '{if(I==$1)print $3}' user_info`
    expect login.exp $ip $user $pass
done

参数说明:

set:可以设置超时,也可以设置变量

timeout:expect超时等待时间,默认10S

spawn:执行一个命令

expect "":匹配输出的内容

exp_continue:继续执行下面匹配

\r:可以理解为回车

$argc:统计位置参数数量

[lindex $argv 0]:脚本后第一个参数,类似于shell中$1,以此类推

puts:打印字符串,类似于echo

awk -v I="$ip":赋值变量

expect{...}:输入多行记录

其他参数说明:

timeout -1:永不超时退出

log_file /var/log/expect.log:记录交互信息,一般crontab时使用

interact:交互后不退出远程终端,如果加要把expect "root@*" {send "exit\r"}注释掉,如果不加,就直接退出

将spawn ssh root@$ip换成spawn ssh -o StrictHostKeyChecking=no root@ip既不会再提示是否将服务器计算机密钥加入本地known_hosts

本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1607723,如需转载请自行联系原作者

linux免交互登陆远程主机并执行命令(密钥对和Expect)相关推荐

  1. shell脚本实现免密钥登陆远程主机

    目标:实现免密登陆脚本, expect登陆远程主机,将生成的密钥写入到目标主机, expect测试远程登陆 一般免密钥登陆有两步操作 step1:主机上生成公钥和私钥 [root@n72-1 ~]# ...

  2. 批量ssh免密登陆远程主机

    案例 1.中心主机以root执行ssh-keygen -t rsa 在/root/.ssh/下生成id_rsa(私钥); id_rsa.pub(公钥); cat /root/.ssh/id_rsa.p ...

  3. unity连接linux服务器,C#编程之C#通过SharpSSH库与Linux服务器建立SSH连接并执行命令...

    本文主要向大家介绍了C#编程之C#通过SharpSSH库与Linux服务器建立SSH连接并执行命令,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助. 在Unity3D项目开发工具时需要用到S ...

  4. 【sshd】sshd_config 中 PermitRootLogin 的forced-commands-only的限定密钥登陆、限定执行命令

    主讲 :PermitRootLogin的可选项 众所周知,sshd_config是sshd的配置文件,其中PermitRootLogin可以限定root用户通过ssh的登录方式,如禁止登陆.禁止密码登 ...

  5. Linux免密登陆(CentOS7.2为例)

    最近总有朋友问如何免密登陆,其实方法很简单 1.设备配置列表 2.主机名映射 3.生成密钥 4.将密钥发送到各个节点 5.注意事项及验证 1.假设有如下设备 设备编号 主机名 系统 IP地址 1 ma ...

  6. c# ssh到linux,C#通过SharpSSH库与Linux服务器建立SSH连接并执行命令

    在Unity3D项目开发工具时需要用到SSH连接远程Linux服务器执行命令,找到SharpSSH链接库后,通过此方法就可使用./// /// SSH登录远程Linux服务器,并运行指令 /// // ...

  7. 详解在 Linux 启动时,如何自动执行命令或脚本

    2019独角兽企业重金招聘Python工程师标准>>> 我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后 ...

  8. linux系统用户登陆时脚本执行顺序

    在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的 /etc/profile.d/file /etc/profile /etc/bashrc /root/.bashrc /root/.b ...

  9. linux命令哲学,Linux哲学思想、history实现执行命令的时间、Linux命令格式

    1.Linux哲学思想 (1)一切皆是文件(包括硬件),所有都以文件形式显示. (2)小型,单一用途的程序 (3)链接程序,共同完成复杂的任务 (4)命令提示符为主 (5)配置数据存储在文本中 2.临 ...

最新文章

  1. C++ 学习笔记之——文件操作和文件流
  2. 2012年 浙工大考研计算机专业课试题C++(学硕)
  3. Linux上安装MongoDB
  4. fpga该驱动器调试dev_dbg 无输出
  5. Sentinel结合Fejgn接口,进行调用远程接口的调用和限流
  6. 小鹏汽车回应“侵犯消费者权益被罚3000元”:已于3月8日对购车协议内容进行调整...
  7. URL、SRC、HREF知识整理
  8. asp.net gridview添加删除确认对话框
  9. 台式计算机开机密码设置,设置台式电脑的开机锁屏密码的方法步骤
  10. 2种方式打开jar文件
  11. INTERVAL 用法
  12. 更改Google Chrome 用户文件存储目录User Data 最简单方法
  13. 【Linux应用编程】Linux编程中常见错误码含义及查询方式
  14. 如何理解蕴含式的真假?
  15. UML类图、6种关系
  16. java 判断字符串重排后是否等于另一个字符串,包括空格符
  17. python opencv设置不同的视频编解码器参数
  18. 五、Web应用开发模式
  19. mysql 空集 赋值_MySQL简单复制问题:’show master status’产生’空集’?
  20. 恒指李阳12.6日预测及操作建议

热门文章

  1. 如何制定恰当的信息安全策略
  2. 基于SSM实现学籍管理系统
  3. 零基础Java学习之类和对象
  4. scp 将数据从一台linux服务器复制到另一台linux服务器
  5. TCP握手--(HTTP权威指南学习笔记)
  6. hibernate关联关系(多对多)
  7. 顺序队列之C++实现
  8. 一文读懂Asp.net core 依赖注入(Dependency injection)
  9. python基础 继承
  10. 关于struts2的开始学习