Linux免交互登陆远程主机并执行命令(密钥对和Expect)

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

1. SSH无密码认证方式

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

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

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

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

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

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

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

4>.设置ssh服务器

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

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

# ssh [email protected]服务端IP ‘df -h‘

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

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

CentOS安装:yum install expect

Ubuntu安装:sudo apt-get install expect

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

#!/usr/bin/expect
set ip 192.168.1.156
set pass 123.com    
set timeout 10
spawn ssh [email protected]$ip
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$pass\r"}
}
expect "[email protected]*"  {send "df -h\r"}
expect "[email protected]*"  {send "exit\r"}
expect eof
# interact

参数说明:

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

spawn:执行一个命令

expect "":匹配输出的内容

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

\r:可以理解为回车

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

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

#!/bin/bash
user=root
pass=‘123‘
ip=‘192.168.1.154‘
/usr/bin/expect << EOF
set timeout 30
spawn ssh [email protected]$ip
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$pass\r"}
}
expect "[email protected]*"  {send "df -h\r"}
expect "[email protected]*"  {send "exit\r"}
expect eof 
EOF

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

# 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 [email protected]$ipaddress
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$password\r"}
}
expect "[email protected]*"  {send "df -h\r"}
expect "$u[email protected]*"  {send "exit\r"}
expect eof
# 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

参数说明:

$argc:统计位置参数数量

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

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

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

时间: 2024-10-14 04:45:26

Linux免交互登陆远程主机并执行命令(密钥对和Expect)的相关文章

## ansible 批量在远程主机上执行命令 ##

目的 代码发布系统 前戏 ansible 批量在远程主机上执行命令 openpyxl 操作excel表格 puppet ansible slatstack ansible epel源 第一步: 下载epel源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 第二步: 安装ansible yum install -y ansible salt 控制节点需要安装salt-master salt

linux -- 启动时启动服务或者执行命令

运行等级 首先,我们需要知道Linux系统关于运行等级的知识.在不同的linux系统上(例如ubuntu和Fedora)这些数字与和所代表的意义可能不同,但主要的有以下几个: 单用户模式. 多用户模式. 网络多用户模式. 用于特殊目的的预留 添加显示管理器到等级3 因此,对于普通的运行等级,服务使用等级3,这时不管X11是否启动,服务将自动启动. 服务,守护进程,服务器 在Ubuntu中,可以使用sys-rc-conf命令简单的选择需要启动的已安装服务. 在Fedora下,可以使用chkconf

expect实现远程主机自动执行命令脚本

2014年第一个脚本,哈哈!!! expect实现远程主机自动执行命令脚本: #!/usr/bin/expect -- if { [llength $argv] < 4 } { puts "Usage: $argv0 ip user passwd port commands timeout" exit 1 } match_max 600000 set ip [lindex $argv 0] set user [lindex $argv 1] set passwd [lindex

配置Linux 免密码登陆

配置Linux 免密码登陆 1 生成秘钥对,一路回车就好 2 修改公钥名称为authorized_keys 3 修改权限为600 4 修改sshd配置文件 5 重启sshd服务 配置Linux 免密码登陆 友情提示:如果需要实现xshell 等终端工具实现免密码登陆的,在生成密钥对的时候,务必先把id_rsa就拷贝出来,不然到时候你配置好了的时候,通过xftp等工具拷贝文件出来,发现本地没有密钥文件,到时候就是死循环了.切记切记!! 1 生成秘钥对,一路回车就好 [[email protecte

Linux使用expect实现免手动密码输入,linux免密码登陆

使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理.  脚本代码如下:  ##############################################  #!/usr/bin/expect  set timeout 30  spawn ssh -l username 192.168.1.1  expect "password:"  send "is

C#通过SharpSSH库与Linux服务器建立SSH连接并执行命令

在Unity3D项目开发工具时需要用到SSH连接远程Linux服务器执行命令,找到SharpSSH链接库后,通过此方法就可使用.   /// <summary>     /// SSH登录远程Linux服务器,并运行指令     /// </summary>     /// <param name="host">远程Linux服务器IP或域名</param>     /// <param name="username&qu

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

我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时,也是这样. 更有意思的是,在系统启动以及用户登录或注销时,还可以让系统执行特定的操作. 本文,我们将探讨一下在 Linux 操作系统中实现这些目标的传统方法. 注意:我们假定使用的是 Bash 作为登录及注销的主 Shell.如果你使用的是其他 Shell,那么有些方法可能会无效.如果有其他的疑问

linux显示当期登陆用户信息“w”命令

功能说明:显示目前登入系统的用户信息. 语 法:w [-fhlsuV][用户名称] 补充说明:执行这项指令可得知目前登入系统的用户有那些人,以及他们正在执行的程序.单独执行w指令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息. 参 数:  -f  开启或关闭显示用户从何处登入系统.   -h  不显示各栏位的标题信息列.   -l  使用详细格式列表,此为预设值.   -s  使用简洁格式列表,不显示用户登入时间,终端机阶段作业和程序所耗费的CPU时间.   -u  忽略执行程序

linux免密码登陆

1 服务端: ssh-keygen -t rsa ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.57.135 [[email protected] sh]# more rsa.sh  #!/bin/sh #by authors chy 2016 for i in $(cat test.txt) do         ssh-copy-id -i /root/.ssh/id_rsa.pub $i         echo $i"设置密码登录成功"