expect实现Linux自动登陆远程机器脚本实例

expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等交互过程,写到Shell脚本里以实现一些自动化操作。

在 Linux 下进行远程登陆的时候,总是要进行 ssh 输入账号密码,相对比较繁琐。

而有时候为了保护线上重要的机器不能随便登录,通常使用从本地登陆到公司的中间机器(跳板机)然后才能登陆到线上的机器。如果 A -> B -> C 三台机器,如果想从 A 直接到 C 只能通过 B 进行登录。下面的脚本就是解决这种有多个依赖的关系。

注意事项:

1. 使用实时 bash version >= 4.0,因为配置中需要使用关联数据

2. 如果需要全局使用直接修改 autologin 的名字,移动到 PATH 路径下即可 eg: mv autologin /usrl/local/bin/to(改为自己想要使用的名字)

脚本代码:

#!/usr/local/bin/bash
# @Version 0.3.1
# @filename to
# 修复等不需要要配置跳板机的时候执行命令,在配置跳板机位置默认填 no 即可
# @Author pemakoa@gmail.com
# Bash version >= 4.0 使用关联数组

# Usage: host user passwd port jump_host command
# 四种情况如下:
# 1. 直接登录目标机器 如 A
# 2. 需要中间机器登陆到目标机器 如 C, 其中 B 为中间机器,会先登录 B在从 B登陆到 C然后执行 command
# 3. 直接登录目标机器并执行相应的命令 如 D

declare -A _server_config

_server_config['A']="a_host a_user a_passwd a_port"
_server_config['B']="b_host b_user b_passwd b_port"
_server_config['C']="c_host c_user c_passwd c_port B '(command eg) ls .'"
_server_config['D']="d_host d_user d_passwd d_port no 'cd /home && ll'"

_config_keys=(${!_server_config[@]})
_length=${#_server_config[@]}
_login_server=$1
_config_status=false

# 是否输入登陆机器
if [ "$_login_server" == "" ];then
    echo -e "\033[40m\033[31m Please input login server, you can choose one follows list \033[0m"
    for i in "${_config_keys[@]}";do
        echo -e "\033[41;37m $i \033[0m "
    done
    exit
fi

# 检查登陆的机器是否配置
for i in "${_config_keys[@]}";do
    if [ "$_login_server" == "$i" ];then
        _config_status=true
    fi
done

if [ "${_config_status}" == "false" ];then
    echo -ne "\033[40m\033[31m
        Not config server info ...
        Please config in _server_config like
        Host User Passwd Port Jump Command\033[0m"
    exit
fi

# 登陆 如果配置跳板机,先登陆跳板机在登陆到目标机器
_host=$(echo ${_server_config["${_login_server}"]} | awk '{print $1}')
_user=$(echo ${_server_config["${_login_server}"]} | awk '{print $2}')
_passwd=$(echo ${_server_config["${_login_server}"]} | awk '{print $3}')
_port=$(echo ${_server_config["${_login_server}"]} | awk '{print $4}')
_jump=$(echo ${_server_config["${_login_server}"]} | awk '{print $5}')
_command=$(echo ${_server_config["${_login_server}"]} | awk -F"'" '{print $2}')

if [ "${_command}" != "" ]; then
    _command="expect \"*]*\"
    send \"${_command}\r\""
fi

if [ "${_jump}" != "" ] && [ "${_jump}" != "no" ]; then
    _jump_host=$(echo ${_server_config["${_jump}"]} | awk '{print $1}')
    _jump_user=$(echo ${_server_config["${_jump}"]} | awk '{print $2}')
    _jump_passwd=$(echo ${_server_config["${_jump}"]} | awk '{print $3}')
    _jump_port=$(echo ${_server_config["${_jump}"]} | awk '{print $4}')

    expect -c "
    set timeout 30
    spawn ssh -p${_jump_port} ${_jump_user}@${_jump_host}
    expect {
        \"yes/no\" { send \"yes\r\"; exp_continue }
        \"assword\" { send \"${_jump_passwd}\r\" }
    }

    expect \"*]*\"
    send \"ssh -p${_port} ${_user}@${_host}\r\"
    expect \"assword:\"
    send \"${_passwd}\r\"
    ${_command}
    interact"
else
    expect -c "
    set timeout 30
    spawn ssh -p${_port} ${_user}@${_host}
    expect {
        \"yes/no\" {send \"yes\r\"; exp_continue }
        \"*assword:\" { send \"$_passwd\r\" }
    }
    ${_command}
    interact
    "
fi

到此这篇关于expect实现Linux自动登陆远程机器脚本实例的文章就介绍到这了,更多相关Linux自动登陆脚本内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux中使用expect脚本实现远程机器自动登录

    首先创建一个expect脚本ssh_expect,文件内容如下: #!/usr/bin/expect -f set hostname [lindex $argv 0] set user [lindex $argv 1] set passwd [lindex $argv 2] set timeout 30 set force_conservative 1 if {$force_conservative} { set send_slow {128 .1} } spawn ssh $user@$hos

  • 详解Linux使用shell+expect远程登录主机

    详解Linux使用shell+expect远程登录主机 最近使用Ubuntu系统想远程登录自己的vps主机,但是感觉自带的远程登录软件不太好使.于是乎想着怎么使用shell脚本来登录,于是Google之后整理了一下,记录一下,方便以后用到. 1.准备工作:安装expect for Ubuntu sudo apt-get update sudo apt-get install expect for Centos yum install expect 2.新建脚本粘贴以下内容 #!/usr/bin/

  • Linux免密码远程登录的实例

    Linux免密码远程登录的实例 如何通过一台Linux ssh远程其他linux服务器时,不要输入密码,可以自动登入.提高远程效率,不用记忆各台服务器的密码. 1. 首先登入一台linux服务器,此台做为母机(即登入其他linux系统用这台做为入口):执行一行命令生成key文件:ssh-keygen -t rsa ,然后一直回车,如下所示: 2. 在母机上,进入/root/.ssh目录,找到id_rsa.pub该文件,这个文件就是刚才执行ssh-keygen所生成的公钥key文件: 3. 最后,

  • Linux expect实现自动登录脚本实例代码

    expect expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我们就没有办法了.所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令. 引言 目前在公司是一人一台虚拟机,大多数工作都要在虚拟机上完成,为此每天要执行很多次[ssh xxx@xxxxxx]指令登录虚拟机:有很多方式解决这个问题,如使用xshell.secureCRT等工具记录常用

  • linux expect实现登陆远程主机并执行命令示例代码

    本文主要给大家介绍了关于linux expect实现登陆远程主机并执行命令的相关内容,分享出来供大家参考学习,下面来一看看详细的介绍: 示例代码: #!/bin/bash export cmd=$1 expect << 'END' set cmd "$env(cmd)" spawn ssh root@192.168.56.1 $cmd expect { "(yes/no)?" {send "yes\r";exp_continue} &

  • expect实现Linux自动登陆远程机器脚本实例

    expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等交互过程,写到Shell脚本里以实现一些自动化操作. 在 Linux 下进行远程登陆的时候,总是要进行 ssh 输入账号密码,相对比较繁琐. 而有时候为了保护线上重要的机器不能随便登录,通常使用从本地登陆到公司的中间机器(跳板机)然后才能登陆到线上的机器.如果 A -> B -> C

  • 微信小程序 自动登陆PHP源码实例(源码下载)

    微信小程序 自动登陆PHP源码实例 app.js 初始化APP自动登陆 您也可以在任何地方进行用户登陆验证 用法:首先在js文件中定义 var app = getApp(); app.getUserDataToken(); App({ onLaunch: function () { /*初始化APP自动登陆 * 您也可以在任何地方进行用户登陆验证 *用法:首先在js文件中定义 var app = getApp(); app.getUserDataToken(); */ this.getUserD

  • 使用python写一个自动浏览文章的脚本实例

    创建python文件fling.py,代码如下: #!/usr/bin/env monkeyrunner import time from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice device = MonkeyRunner.waitForConnection(5) loop = 0 loop_back = 0 # fling up def scrollUpFling(): device.touch(100, 500,

  • Putty实现自动登陆远程Linux主机的方法

    由于工作需要,经常要从 Windows 主机访问远程的 Ubuntu 服务器,每次输入账号和老长的密码,感觉很麻烦,于是参考网上的教程简单的设置了一下就能自动登陆远程主机了,非常的方便. 虽然 Putty 也提供了 puttygen.exe 生成公/密钥,但是和 Linux 主机生成的 KEY 格式不同,需要手工修改格式,所以采用 Linux 主机自己生成 KEY 的方式. 首先登陆到 Linux 主机,具体过程如下: 1. 生成公钥和密钥 复制代码 代码如下: verdana@hostname

  • Linux自动备份MySQL数据库脚本代码

    在脚本中可设置需要备份的数据库表清单,并且会将备份文件通过gzip压缩.需要注意的是,这段脚本仅适用数据一致性要求不高的环境. 复制代码 代码如下: #!/bin/bash mysql_pwd="password"mysql_dump="/usr/local/mysql/bin/mysqldump"cur_year=$(date +"%Y") cur_month=$(date +"%m") cur_day=$(date +&q

  • 如何利用Gitlab-ci持续部署到远程机器(详细教程)

    长话短说,今天聊一聊使用Gitlab-CI 自动部署到远程服务器. 看过这篇文章的朋友,会注意到我是在 Gitlab-Runner服务器上自动部署的站点,本次我们结合ssh部署到远程机器(将CI服务器和部署服务器分离,避免资源抢占). SSH免密登陆 还是那句话,CI/CD实质是将我们手动集成.拷贝部署的方式脚本化,远程部署的重要姿势是要求免密操控. 要让Gitlab Runner部署到远程机器,远程机器必须信任gitlab runner账户. 先执行su gitlab-runner切换到git

  • 如何用java程序(JSch)运行远程linux主机上的shell脚本

    运行远程主机上的shell脚本 下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本.(我讲的不是一个黑客学习教程,而是使用用户名密码去执行有用户认证资格的主机上的shell脚本).并且通过java程序获得shell脚本的输出. 首先通过maven坐标引入JSch依赖库,我们正是通过JSch去执行远程主机上的脚本. <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch<

  • CMD里或登陆远程linux服务器时命令行下复制和粘贴实现方法

    如果要在CMD中复制的话,必须通过鼠标. 复制:要先标记(在CMD中击鼠标右键)要复制的内容(或者称是范围),然后鼠标点击右键或按回车(或Ctrl+C)即可复制完成. 粘贴:击右键粘贴即可把复制到粘贴板上的内容粘贴到CMD中. putty登陆远程大型机 复制:双击选中或鼠标拖动选中要复制的内容 粘贴:点右键直接粘贴 Xshell登陆远程大型机 复制:光标选中要复制的内容,按Ctrl+Insert 粘贴:Shift+Insert

  • shell实现SSH自动登陆的方法示例

    前言 公司开发使用docker,每次登陆自己开发机总要输入 ssh user_name@ip_string,然后再确认输入password,手快了还经常会输错.作为一个懒人,肯定要找一个取巧的方式,查看了下ssh命令,由于它要进行一次跟服务器的加密交互,所以没有直接附带密码登陆的选项,只好作罢. 前些天在同事进行技术分享时,看到他竟然只输入了一行命令./test.sh就成功登陆了开发机,甚是惊异,于是回来搜索研究了一下,遂成此文. shell脚本基础 在编写ssh自动登陆脚本之前,先说一下she

随机推荐