Shell脚本实现自动输入密码登录服务器

 更新时间:2015年03月17日 09:35:17   投稿:junjie  
这篇文章主要介绍了Shell脚本实现自动输入密码登录服务器,本文使用expect来实现这个需求,讲解了expect的安装及使用脚本,需要的朋友可以参考下

使用Linux的程序员对输入密码这个举动一定不陌生,在Linux下对用户有严格的权限限制,干很多事情越过了权限就得输入密码,比如使用超级用户执行命令,又比如ftp、ssh连接远程主机等等,如下图:

那么问题来了,在脚本自动化执行的时候需要输入密码怎么办?比如你的脚本里有一条scp语句,总不能在脚本执行到这一句时手动输入密码吧。

针对于ssh或scp命令,可能有人会回答是建立信任关系,关于建立ssh信任关系的方法请自行百度Google,只需要两行简单的命令即可搞定,但这并不是常规的解决方案,如果是ftp连接就没辙了,况且,你不可能为了执行某些命令去给每个你要连接的主机都手动建立ssh信任,这已经偏离了今天主题的本意,今天要说的是在脚本里自动输入密码,我们可以想象下,更优雅的方式应该是在脚本里自己配置密码,当屏幕交互需要输入时自动输入进去,要达到这样的效果就需要用到expect。

安装
CentOS下安装命令很简单,如下

复制代码 代码如下:

sudo yum install expect 

至于Mac用户,可以通过homebrew安装(需要先安装homebrew,请自行Google)
复制代码 代码如下:

brew install expect 

测试脚本
我们写一个简单的脚本实现scp拷贝文件,在脚本里配置密码,保存为scp.exp如下

复制代码 代码如下:

#!/usr/bin/expect 
set timeout 20 
 
if { [llength $argv] < 2} { 
    puts "Usage:" 
    puts "$argv0 local_file remote_path" 
    exit 1 

 
set local_file [lindex $argv 0] 
set remote_path [lindex $argv 1] 
set passwd your_passwd 
 
set passwderror 0 
 
spawn scp $local_file $remote_path 
 
expect { 
    "*assword:*" { 
        if { $passwderror == 1 } { 
        puts "passwd is error" 
        exit 2 
        } 
        set timeout 1000 
        set passwderror 1 
        send "$passwd\r" 
        exp_continue 
    } 
    "*es/no)?*" { 
        send "yes\r" 
        exp_continue 
    } 
    timeout { 
        puts "connect is timeout" 
        exit 3 
    } 

注意,第一行很重要,通常我们的脚本里第一行是#!/bin/bash,而这里是你机器上expect程序的路径,说明这段脚本是由expect来解释执行的,而不是由bash解释执行,所以代码的语法和shell脚本也是不一样的,其中set passwd your_passwd设置成你自己的密码,然后执行如下命令

复制代码 代码如下:

./scp.exp ./local_file user@host:/xx/yy/ 

执行前确保scp.exp有执行权限,第一个参数为你本地文件,第二个为远程主机的目录,运行脚本如果报错“connect is timeout”,可以把超时设长一点,第二行set timeout 20可以设置超时时间,单位是秒。脚本执行效果如下

还能做什么

细心的同学一定发现了,其实expect提供的是和终端的一种交互机制,输入密码只是其中一种应用形式,只要是在终端阻塞需要输入时,都可以通过expect脚本完成自动输入,比如前面脚本里配置了两种交互场景,一种是终端提示"password:"时输入密码,还有一种是提示"yes/no)?"时输入“yes”,如果和远程主机是第一次建立连接,执行scp.exp脚本效果是这样的

所以我们可以根据终端的提示来配置输入命令,这样就能达到了自动化的效果。至于处理其它交互场景,只需要照着上面的脚本依葫芦画瓢就行了

相关文章

  • Linux中根据一个单词快速锁定到日志的操作命令

    Linux中根据一个单词快速锁定到日志的操作命令

    这篇文章给大家介绍了Linux中如何根据一个单词快速锁定到日志,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Linux Shell简介

    Linux Shell简介

    本文编译整理时对相关章节做了相应的删改处理,去掉了针对Mandrake Linux的部分内容
    2013-06-06
  • 如何查看Linux提供的Shell解析器

    如何查看Linux提供的Shell解析器

    这篇文章主要介绍了查看Linux提供的Shell解析器的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • linux echo命令以及linux echo命令提示权限不够的解决办法

    linux echo命令以及linux echo命令提示权限不够的解决办法

    linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法。下面通过本文给大家介绍linux echo命令以及linux echo命令提示权限不够的解决办法,感兴趣的朋友一起看看吧
    2017-09-09
  • shell脚本echo输出不换行功能增强实例

    shell脚本echo输出不换行功能增强实例

    这个脚本很简单,就是可以用3种不同的函数(方法)来实现,输出后不换行
    2016-08-08
  • Linux中实现非登录系统用户执行命令的方法

    Linux中实现非登录系统用户执行命令的方法

    Linux系统中,管理员经常需要通过一个无法登录shell的系统用户来执行特定的命令,这种需求在管理多用户系统或自动化任务时尤为常见,下面,我们将详细讲解如何实现这一需求,并深入分析其背后的原理,需要的朋友可以参考下
    2024-01-01
  • 详解 linux mysqldump 导出数据库、数据、表结构

    详解 linux mysqldump 导出数据库、数据、表结构

    这篇文章主要介绍了详解 linux mysqldump 导出数据库、数据、表结构的相关资料,需要的朋友可以参考下
    2017-05-05
  • Linux 中fork的执行的实例详解

    Linux 中fork的执行的实例详解

    这篇文章主要介绍了Linux 中fork的执行的实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • linux 查找大目录和大文件的方法(推荐)

    linux 查找大目录和大文件的方法(推荐)

    下面小编就为大家带来一篇linux 查找大目录和大文件的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Linux启动新进程的几种方法及比较

    Linux启动新进程的几种方法及比较

    有时候,我们需要在自己的程序(进程)中启动另一个程序(进程)来帮助我们完成一些工作,那么我们需要怎么才能在自己的进程中启动其他的进程呢?在Linux中提供了不少的方法来实现这一点,下面就来介绍一个这些方法及它们之间的区别。
    2017-04-04

最新评论