Linux的脚本中自动登录远程主机方法汇总

Linux的脚本中自动登录远程主机方法汇总mysql

 

为了方面,我写了个脚本自动ssh登陆远端机器,以下,这个脚本须要安装expect包linux


--------------------------------------------------------------------------------sql

================================shell

#!/usr/bin/expect
set timeout 30
spawn ssh -l root 192.168.1.117
expect "password:"
send "nopasswd\r"
interact数据库

================================编程

set timeout 30
设置超时时间的,计时单位:秒windows

spawn ssh -l root 192.168.1.117
spawn是进入expect环境后才能够执行的expect内部命令,若是没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。因此不要用 “which spawn“之类的命令去找spawn命令。比如windows里的dir就是一个内部命令,这个命令由shell自带,你没法找到一个dir.com 或 dir.exe 的可执行文件。它主要的功能是给ssh运行进程加个壳,用来传递交互指令。bash

expect "password:"
这里的expect也是expect的一个内部命令,expect的shell命令和内部命令是同样的,但不是一个功能。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,若是有则当即返回,不然就等待一段时间后返回,这里等待时长就是前面设置的30秒服务器

send "nopasswd\r"
这里就是执行交互动做,与手工输入密码的动做等效。
舒适提示: 命令字符串结尾别忘记加上 “\r”,若是出现异常等待的状态能够核查一下。ssh

interact
执行完成后保持交互状态,把控制权交给控制台,这个时候就能够手工操做了。若是没有这一句登陆完成后会退出,而不是留在远程终端上。若是你只是登陆过去执行一段命令就退出,可改成〔expect eof〕

注意:在crontab里执行expect脚本,那么最后一句就不能是interact,应该是expect eof

参考:http://my.unix-center.net/~xiaoshe/tag/expectcrontabmysql按期备份数据库/

以下为网上转载的其余的shell自动交互的方法


--------------------------------------------------------------------------------

src:http://os.51cto.com/art/200912/167898.htm

你了解Linux系统么?你是Linux系统的应用者么?若是你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和你们分享一下。

1、背景

shell脚本在处理自动循环或大的任务方面可节省大量的时间,经过建立一个处理任务的命令清单,使用变量、条件、算术和循环等方法快速建立脚本以完成相应工做,这比在命令行下一个个敲入命令要省时省力得多。

可是有时候咱们可能会须要实现和交互程序如ftp,telnet服务器等进行交互的功能,这时候咱们须要用到shell的自动交互功能,本文收集了较经常使用的三种自动交互方法,并进行了比较和总结。

2、需求

需求1:
从一台Linux机器ftp登录到另外一台Linux机器,进行系列操做后关闭,懒得每次都手动输入密码。

需求2:
改变登陆用户密码,懒得每次都输入新旧密码。

需求3:
但愿su自动登陆到root帐户,懒得每次都输入root密码。

3、调试环境

终端:SecureCRT

系统:WinXP, CentOS 4.4(VmWare)

Shell:bash

注:shell有不少种,B类SHELL(sh, bash, ksh)之间行为相近;C类SHELL(csh, tcsh)之间行为相近,还有zsh和rc等shell,本文的调试环境是bash。

4、自动交互方法一

自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7):"command << delimiter 从标准输入中读入,直至遇到delimiter分界符。"

重定向操做符command << delimiter是一种很是有用的命令,shell将分界符delimiter以后直至下一个一样的分界符以前的全部内容都做为输入,遇到下一个分界符, shell就知道输入结束了。最多见的delimiter分界符是EOF,固然彻底能够自定为其余字符。

对于需求1 要求的自动登录ftp,并做系列操做,则能够用这种方法进行自动交互。代码以下:

1. #!/bin/bash 
2. ftp -i -n 192.168.167.187 << EOF 
3. user hzc 123456 
4. pwd 
5. cd test 
6. pwd 
7. close 
8. bye 
9. EOF

测试能够发现,如上代码使用账号名hzc,密码123456成功登录了ftp服务器,并进入目录,打印出了pwd。

5、自动交互方法二

需求2中要求采用非交互的方式改变登陆用户密码,尝试用方法1,没法实现。

这时候联想到交互信息的另外一个自动输入方法,管道,经过echo + sleep + | 能够实现这个需求。

1. #!/bin/bash 
2. (echo "curpassword" 
3. sleep 1 
4. echo "newpassword" 
5. sleep 1 
6. echo "newpassword")|passwd

测试经过,运行这个脚本,直接把当前用户的curpassword改为newpassword。

6、自动交互方法三

需求3中要求自动登陆root帐号,尝试方法1和方法2,都出现错误提示standard in must be a tty。

这时候尝试寻找外部帮助,一个shell工具expect能够实现这个功能,其实expect就是一个专门用来实现自动交互功能的工具,expect的语法能够参考相关资料,代码以下:

1. #!/usr/bin/expect 
2. spawn su root 
3. expect "password: " 
4. send "123456\r" 
5. expect eof 
6. exit

测试经过,运行这个脚本,直接从当前用户登陆到root用户。

7、方法总结

方法一(重定向)简单直观,也常常有实际应用,可是在自动交互领域功能有限。

方法二(管道)也很简单直观,有时甚至不用sleep配合就能展示强大的自动交互实力,可是在某些时候也一筹莫展。

方法三(expect)在功能上是最为强大的,expect原本就是为实现自动交互功能而生,可是缺点是须要安装expect包,在嵌入式等环境下难以安装。

三个方法各有优劣,应用的好,均可以

相关文章
相关标签/搜索