linux脚本实现自动输入密码

使用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 [email protected]:/xx/yy/

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

还能做什么

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

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

时间: 2024-10-06 22:59:44

linux脚本实现自动输入密码的相关文章

shell脚本中自动输入密码

最近刚学会的scp自动输入密码. #!/bin/bash set -x TIME=`date +%Y%m%d%H%M%S` SOURCE='/home/cqq/project' PASSWD='123' tar zcvf  ${TIME}.tar.gz  $SOURCE >>/dev/null  2>&1 expect -c " spawn scp -r  [email protected]:/home/cqq/project/src/  /home/test/ exp

shell脚本通过expect脚本实现自动输入密码(使用expect)

背景:在远程文件下载时,需要输入对方的服务器密码,shell不支持交互输入内容,可以用下面两种方式实现 一.在shell脚本中嵌入expect来实现密码输入 expect是一个自动交互功能的工具.expect是开了一个子进程,通过spawn来执行shell脚本,监测到脚本的返回结果,通过expect判断要进行的交互输入内容(send) 1.安装expect 需要先安装tcl:apt-get install tcl apt-get install expect 2.expect使用 2.1一个简单

ubuntu运行sh脚本sudo自动输入密码

示例: sudo apt-get update 第一种方法:使用管道(上一个命令的 stdout 接到下一个命令的 stdin): #!/bin/bashecho password | sudo -S apt-get update第二种方法使用文本块输入重定向: 第二种方法:#!/bin/bashsudo -S apt-get update << EOF 你的密码EOF 说明: 在shell脚本中,通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇

添加自动远程连接的脚本,自动输入密码,节省时间。

参考了 http://blog.csdn.net/topasstem8/article/details/17920127  和 http://blog.sina.com.cn/s/blog_560e31000101ajgw.html  的内容 #!/usr/bin/expectspawn ssh -l snq 192.168.100.137expect "password:"send "12345678\r"#expect eof#exitinteract 主要使用

expect实现脚本的 自动交互

1.需求 最近需要使用scp自动将本地服务器的文件拷贝到远程服务器上; 2.安装expect #安装expect前,需要安装tcl环境 yum -y install tcl yum -y install expect 3.expect脚本 #!/usr/bin/expect set passwd "xxxx" set ip "192.168.x.xxx" set username "scpuser" #不论是在此脚本内自动输入密码还是在脚本外手工

Linux中shell脚本自动输入密码

最近遇到蛋疼的事,就是在shell脚本中需要获取root权限,因此在shell脚本运行过程中需要输入密码. 懒惰的我当然想让shell在执行过程中就可以自动输入密码,这样就可以抽空看看妹子图.. 我通过查询资料了解到,可以通过“ 重定向操作符 ” 将标准输入内容作为内容自动输入.但是这样需要用 -i 参数结束交互式输入 例如: sudo -i nginx < pwd 然后另建一个文件:pwd.内容为密码:1234.

linux备份和mysql登陆自动输入密码

1.mysql自动登陆,系统自己输入密码 (1)安装亿需要的软件 [[email protected] ~]# yum install expect-* (2)在脚本中写入命令 #!/usr/bin/expect -f             --使用expect软件set timeout 2                   --输出密码时延时2秒spawn mysql -u root -p           --mysql登陆命令expect "system"         

Shell脚本交互之:自动输入密码

Shell脚本交互之:自动输入密码 2016年04月09日 19:41:26 zhangjikuan 阅读数:58208 标签: Shell交互自动输入密码expect重定向管道 更多 个人分类: ARM/linux 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhangjikuan/article/details/51105166 平时在控制台输入指令如:sudo.ssh.ftp或者修改admin权限的文件时候都会要求输入password,

Linux - 通过expect工具实现脚本的自动交互

目录 1 安装expect工具 2 expect的常用命令 3 作用原理简介 3.1 示例脚本 3.2 脚本功能解读 4 其他脚本使用示例 4.1 直接通过expect执行多条命令 4.2 通过shell调用expect执行多条命令 5 spawn not found 的解决 1 安装expect工具 expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程是: spawn启动指定进程 -> expect获取指定关键字